1. 程式人生 > 其它 >GCD最大公約數——輾轉相除法實現

GCD最大公約數——輾轉相除法實現

一個比較簡單的演算法,這裡記錄一下相關筆記。

最大公約數是指能夠整除多個整數的最大正整數(這裡面多個整數不能都為0)例如6和4的最大公約數就是2,13和3的最大公約數是1。

演算法實現

平時用的時候如果是C++,那麼std庫裡面就已經有這個函數了,直接呼叫就行。具體可以看std::gcd的用法。比較常見的實現方式是:

int gcd(int x, int y) {
    return y == 0 ? x : gcd(y, x % y);
}

這裡採用的是輾轉相除法,兩數相除取餘數和除數繼續相除,直到餘數為0,這時前一個餘數就是最大公約數。舉個例子:

252和105,求最大公約數:

首先第一步,\(252 \mod 105 = 147\)

。下一步要用餘數和除數繼續相除,因為\(147 > 105\)所以\(147\)在下一步要繼續當被除數。

第二步,\(147 \mod 105 = 42\),得到餘數\(42\),因為\(42\)小於\(105\),所以下一步需要\(105\)當被除數,\(42\)當除數。

第三步,$105 \mod 42 = 21 $,得到餘數\(21\)

最後一步,\(42 \mod 21 = 0\),取上一步的餘數\(21\),就是最大公約數。

這裡解釋一下,實際上y充當的是求餘之後的結果,當求餘結果等於0的時候那麼說明已經不需要繼續遞迴下去了,直接取上一次求餘的結果,就可以得到最大公約數,而剛好x存放的就是上一次傳入的y(此時假設已經在遞迴中),即x%y

,上一次求餘的結果,因此在當前y為0時應當返回x

參考資料

  1. C++ 中的 std::gcd 函式
  2. 輾轉相除法