问题一:求两个数字的最大公约数(GCD)及其最小公倍数(LCM)
问题二:求任意个数字的最大公约数(GCD)及其最小公倍数(LCM)
其实问题二就是问题一的重复与递归形式。相信大家都了解过很多求GCD和LCM的方法,但个人最推荐辗转相除法(即欧几里得算法),思想简单,代码简短易于理解。
本文先看两个数字的GCD与LCM的代码和问题二的代码。涉及到原理,想仔细看任意个数字的GCD与LCM的请点击上方蓝字部分。
第一种:这种代码是中规中矩的非递归形式,可以认为是两个参数不断地变换然后向左移位。(自行领会一下)
public static int GCD(int a, int b) {
while(b!=0) {
int temp = b;//借助temp这个中间变量来暂存b的原始值
b = a%b;//辗转相除法精髓,可理解为不断相除
a = temp;//还原b的值
}
return a;
}
第二种:为递归形式,但其实原理相同,如果你不懂运算符的话就自己去补一下吧,链接给到
https://baike.baidu.com/item/三目运算符/6434591?fr=aladdin
public static int GCD(int a, int b) {
return b==0?a:GCD(b,a%b);
}
众所周知,LCM = (a * b) / GCD( a , b ); 代码如下:
public static int LCM(int a, int b) {
return a*b/(GCD(a, b));
}
对于任意数量的数字求GCD与LCM,可以用for循环递归来完成,下面的代码同样可以解决问题一。如果想看完整代码请点击顶部蓝字部分链接。
static int GCD(int[] num) {
int n = num.length;
int g = a[0];
for(int i = 1;i < n;i++){
g = GCD(g,num[i]);
}
return g;
}
static int LCM(int[] num) {
int n = num.length;
int l = num[0];
for(int i = 1;i < n;i++){
l = LCM(l,num[i]);
}
}