1. 程式人生 > 其它 >求兩個數的最大公約數與最小公倍數

求兩個數的最大公約數與最小公倍數

輾轉相減法

 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稱作輾轉相除法裡的步數.