两个或多个整数公有的倍数叫做它们的公倍数。
两个或多个整数的公倍数里最小的那一个叫做它们的最小公倍数。
直接贴出两个正数的最小公倍数的求法,这是我在大学学习java的时候的想法,虽然性能不好,但还是可以实现的.
代码如下
/**
* 求两个数的最小公倍数
* @param num1
* @param num2
* @return 两个数的最小公倍数
*/
public int minNUM(int num1, int num2) {
if (num1 >= num2){
//如果大数可以整除小数,则直接返回大数
if(num1%num2 == 0)
return num1;
//开始从2循环,判断这两个数能不能同时除以一个数
for(int i = 2;i<num2/2+1;i++){
//如果两个数有公约数
if(num1%i == 0 && num2%i == 0){
//提取公约数,讲约过的两个数继续求公约数
return i*minNUM(num1/i,num2/i);
}
}
//没有公约数,则返回两数积
return num1*num2;
}else{
return minNUM(num2,num1);
}
}
上面代码用到递归,递归我会在以后另发博文送上
当求N个正整数的最小公倍数,则可以把前N-1个数的最小公倍数看成一个数跟最后一个数求两个数的最小公倍数,然后通过递归算法,讲前N-1个数继续递归,直至求两个数的最小公倍数
奉上代码:
/**
* 求N个正正数的最小公倍数
* @param arr N个数的数组
* @index 数组要分离的最后一位
* @return N个数的最小公倍数
*/
public int minNUMS(int[] arr,int index){
//分离到数组的第一位,
if(index==1){
return arr[0];
}
return minNUM(minNUMS(arr,index-1),arr[index-1]);
}
想不起来大学的时候是怎么处理了,临时想的,测试是可以的,就是不太好理解,上面的代码性能上差很多,
贴出来上次在算法书上看到的求两个数最小公倍数的方法:
public int minSUM(int n,int m){
if(m>n) //保证第一个数不小于第二个数
return minSUM(m,n);
int temp;
int num1= n,num2=m;
while(n % m != 0){
temp = n % m;
n =m;
m =temp;
}
//m为最大公约数
return num1*num2/m;
}