欧几里德算法又称辗转相除法,可用于计算两个正整数的最大公约数。而对于两个正整数的最小公倍数呢,有这样一个定理:
对于两个正整数 a 和 b,有gcd(a, b) * lcm(a, b) == a * b。
下面看具体的实现代码:
/*
* 求解最大公约数(递归实现)
*/
public static int gcd(int a, int b) {
if (a < 0 || b < 0)
return -1;
if (b == 0)
return a;
return gcd(b, a % b);
}
/*
* 求解最大公约数(非递归实现)
*/
public static int gcd1(int a, int b) {
int temp;
while (a % b != 0) {
temp = a % b;
a = b;
b = temp;
}
return b;
}
/*
* 求解最小公倍数 定理:对于两个正整数 a和 b,有gcd(a, b) * lcm(a, b) == a * b
*/
public static int lcm(int a, int b) {
if (a < 0 || b < 0)
return -1;
return a * b / gcd(a, b);
}
对于求三个及以上正整数的最小公倍数,我们可以先求出其中两个数的最小公倍数,再求这个最小公倍数与另个一数的最小公倍数,这样下去最后的结果将是这组数的最小公倍数。
设计思路:
声明一个数组a[n]来存n个要求最小公倍数的正整数,从a[1]开始的每一个a[ i ],求a[ i ] = lcm( a[ i ],a[ i - 1 ] ),依次求下去,最后一步是a[n-1] = lcm( a[n-1],a[n-2] )。a[n - 1]也就是所求结果。具体代码如下:
/*
* 求解正整数数组a中所有元素的最小公倍数
*/
public static int f(int[] a) {
for (int i = 1; i < a.length; i++) {
a[i] = lcm(a[i], a[i - 1]);
}
return a[a.length - 1];
}