簡談求2個及多個數字的最小公倍數(LCM)和最大公約數(GCD)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章