求兩個數的最大公約數與最小公倍數
輾轉相減法
1 //相減法計算兩個數的最大公約數和最小公倍數 2 void sub(int num1, int num2) { 3 int x, y; //用於儲存num1,num2初始資料 4 x = num1; 5 y = num2; 6 while(num1 != num2) { //迴圈條件為兩數不相等 7 if(num1 > num2) //如果第一個數大於第二個數 8 num1 = num1 - num2; //兩數相減 9 else 10 num2 = num2 - num1; 11 } 12 System.out.println("---------------------------------"); 13 System.out.println("利用相減法計算所得的最大公約數為:"+ num1); //最大公約數 14 System.out.println("利用相減法計算所得的最小公倍數為:"+ x*y/num1); //最小公倍數 15 System.out.println("---------------------------------");16 }
輾轉相除法又叫歐幾里得演算法,是歐幾里得最先提出來的.不過這個名字有點不好,就如同在數學裡說尤拉定理這個詞一樣,你不知道說的是哪個定理,因為尤拉發現的定理實在是太多……輾轉相除法的實現,是基於下面的原理(在這裡用(a,b)表示a和b的最大公因數):
(a,b)=(a,ka+b),其中a、b、k都為自然數.………………①
也就是說,兩個數的最大公約數,將其中一個數加到另一個數上,得到的新數,其公約數不變,比如(4,6)=(4+6,6)=(4,6+2×4)=2.
要證明這個原理很容易:如果p是a和ka+b的公約數,p整除a,也能整除ka+b.那麼就必定要整除b,所以p又是a和b的公約數,從而證明他們的最大公約數也是相等的.
基於上面的原理,就能實現我們的迭代相減法:
(78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2
基本上思路就是大數減去小數,一直減到能算出來為止,在作為練習的時候,往往進行到某一步就已經可以看出得值.迭代相減法簡單,不過步數比較多,實際上我們可以看到,在上面的過程中,由(78,14)到(8,14)完全可以一步到位,因為(78,14)=(14×5+8,14)=(8,14),由此就誕生出我們的輾轉相除法.
用輾轉相除法求(a,b).設r0=b,r1=a,反覆運用除法算式,得到一系列整數qi,ri和下面的方程:
相當於每一步都運用原理①把數字進行縮小,上面右邊就是每一步對應的縮小結果,可以看出,最後的餘數rn就是a和b的公約數.我們以一個題為例說明基本過程.
例題:求(326,78)
所以(326,78)=2.這和我們用迭代相減法算出來的結果是一樣的.所以中學的同學們應該看到,迭代相減法和輾轉相除法在本質上是一樣的,相對來說,減法比較簡單,但是除法步數少.
我們要看到的是,在輾轉相除法中,我們必須算到最後一步才知道rn是不是所求的最大公因數,所以我們把n稱作輾轉相除法裡的步數.