問題一:求兩個數字的最大公約數(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]);
}
}