分治法求解数组内多个元素最小公倍数问题

public class Main {     //测试函数
	public static void main(String[] args) {
		final int LENGTH=50;
		int[] a=new int[LENGTH];
		a[0]=1;
		for(int i=1;i<LENGTH;i++)
			a[i]=a[i-1]+1;
		long time_start=System.currentTimeMillis();
		for(int i=0;i<LENGTH;i++)
			System.out.println("前"+(i+1)+"的公倍数:"+ getMinTimes(a, 0, i));
			long time_stop=System.currentTimeMillis();
		System.out.println("time:"+(time_stop-time_start)+"ms");
	}

	public static long getMinTimes(int[] a,int low ,int high){
		if((high-low)>1){
			int mid=(high+low)/2;
			long left=getMinTimes(a, low, mid);
			long right=getMinTimes(a, mid+1, high);
			return left/getMaxDivisor(left, right)*right;
		}else if((high-low)==1){
			return a[low]/getMaxDivisor(a[low], a[high])*a[high];
		}else {
			return a[low];
		}
	}

	public static long getMaxDivisor(long x,long y){
		long a=x>y?x:y;
		long b=x>y?y:x;
		long rmd=a%b;
		while(rmd!=0){
			a=b;
			b=rmd;
			rmd=a%b;
		}
		return b;
	}
}

  每次数组一分为二,然后再计算左右两个数组的最小公倍数,再进行合并,下面是运行结果:

前1的公倍数:1
前2的公倍数:2
前3的公倍数:6
前4的公倍数:12
前5的公倍数:60
前6的公倍数:60
前7的公倍数:420
前8的公倍数:840
前9的公倍数:2520
前10的公倍数:2520
前11的公倍数:27720
前12的公倍数:27720
前13的公倍数:360360
前14的公倍数:360360
前15的公倍数:360360
前16的公倍数:720720
前17的公倍数:12252240
前18的公倍数:12252240
前19的公倍数:232792560
前20的公倍数:232792560
前21的公倍数:232792560
前22的公倍数:232792560
前23的公倍数:5354228880
前24的公倍数:5354228880
前25的公倍数:26771144400
前26的公倍数:26771144400
前27的公倍数:80313433200
前28的公倍数:80313433200
前29的公倍数:2329089562800
前30的公倍数:2329089562800
前31的公倍数:72201776446800
前32的公倍数:144403552893600
前33的公倍数:144403552893600
前34的公倍数:144403552893600
前35的公倍数:144403552893600
前36的公倍数:144403552893600
前37的公倍数:5342931457063200
前38的公倍数:5342931457063200
前39的公倍数:5342931457063200
前40的公倍数:5342931457063200
前41的公倍数:219060189739591200
前42的公倍数:219060189739591200
前43的公倍数:7550878139845887136
前44的公倍数:7550878139845887136
前45的公倍数:-9027155914907130016
前46的公倍数:-7649500553069439584
前47的公倍数:3012796197927393248
前48的公倍数:3012796197927393248
前49的公倍数:-8062099791253733216
前50的公倍数:3382763084072585376
time:16ms

   后面几行因为超出long范围,所有显示错误。

时间: 2024-10-06 19:15:33

分治法求解数组内多个元素最小公倍数问题的相关文章

《github一天一道算法题》:分治法求数组最大连续子序列和

看书.思考.写代码! /*************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using nam

分治法求数组的最大值最小值

实现求数组的最大值最小值,蛮力法要容易的多.本着重在体验分治法的思想的原则: 1 int main(void) 2 { 3 void Maxmin(int a[],int low,int high,int maxmin[2]); 4 int a[10],maxmin[2]; 5 6 printf("Enter 10 integer numbers:\n"); 7 for(int i=0;i<10;i++) 8 scanf("%d",a+i); 9 10 Max

分治法求解最大子数组问题

/*     本问题是求解最大子数组问题     普通方法的复杂度为n^2     现在尝试给出一种小于n^2的算法     当然数组中必须要有负数,不然没有意义     本例中使用分治策略 */ #include<stdio.h> #include<stdlib.h> //定义返回结构体 typedef struct result {     int left; //左索引     int right; //右索引     int sum; //最大和 }*Res; //求解包含

求解最大子数组问题 -- 暴力求解 和 分治法求解

/*------------------ 求解最大子数组问题 --------------- 最大子数组,就是求解一个数组的所有元素的各种组合中,和最大的 那个子数组.在这种情况下,如果元素值全部非负,那么最大子数组当然 是所有元素.但是如果有负值的元素存在,那么久需要找到一个由数组中 连续几个元素组成的子数组并且其元素值之和最大. */ #include <iostream> using namespace std; struct ArrayStruct { ArrayStruct(int

使用sort加个简单的算法,不循环整个数组而删除数组内的某些元素。

昨天遇到一个这样的场景: 有一个不分页的商品列表,里面可能有上千条数据(而且可能是静态数据)甚至更多,这里有个删除功能,需要我们删除其中的一些商品. 这时我的第一反应就是,数据过多不能循环整个数组,只有获取到它们的索引,然后循环得到的索引,使用数组的splice()方法对它进行删除.并且我这样做了,但是发现了一个致命的bug. bug的原因是这样的: 我先得到了一组索引(就是我所需要删除的商品的索引),然后循环了这组索引,在每次循环的时候我执行了splie()方法,但是由于splice方法执行后

分治法计算最大字数组(Python)

比如你获得了一个投资某个股票的机会,并且,你已经准确知道了将来几天这一只股票的相对于前一天的插值,比如为[13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7],那么就有一个问题,从那一天买入,哪一天卖出获益最大?这里就是一个最大字数组问题. 最大字数组问题:在一个数组中找出最大的非空连续子数组 常见方法,暴力求解找出所有的组合,共有C(n,2)种选择,时间复杂度Theta(n^2) 分治法求解最大字数组问题,计算复杂度theta(nlogn) 分

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

分治法-最近距离问题Java实现

分治算法,有很多典型的问题,如最近点问题.线性选择问题.整数划分问题.大整数成绩问题.棋盘覆盖问题.循环赛日程表.二分搜索.Strassen矩阵乘法.汉诺塔等.准备花些时间逐个解决这些问题,并用Java实现,从最近点问题开始.网上找到一些代码,标题如"java 用蛮力法和分治法求解最近对有关问题",虽然体现了分治,但划分不够彻底,因此我重新对其进行了实现. 一.基本思想及策略: 首先,说说分治的思想.分治, "分而治之",就是把一个复杂的问题分成两个或更多的相同或相

分治法求逆序对数目

设A[1..n]是一个包含n个不同整数的数组.如果在i<j的情况下,有A[i]>A[j],则(i,j)就称为A中的一个逆序对(inversion). 给出一个算法,确定n个元素的任何排列中逆序对的书目.时间复杂度为o(nlgn). 分治法求解思路: 分解:将数组A[1..n]分为两个子序列A[1..p]和A[p+1,n],二分法将其分解.. 解决:根据归并排序的思想,在合并过程中,计算逆序对.假如两个子序列为X={4,5}和Y={2,3},则XY的逆序对为X中元素大于Y中元素的数目. 合并:对