# a024 - 最大公因數(GCD) ### 題目連結: [a024](https://zerojudge.tw/ShowProblem?problemid=a024) ### 題目解析 * 輸入兩個整數,利用程式撰寫求得這兩個數字的最大公因數 ### 題目類型 數學/迴圈/函式/遞迴邏輯/流程控制 ### 範例測資解讀 * 輸入 * 兩個整數均大於 0,也就是非 0 的正整數 * 正整數的範圍最大到 `2的31次方 = 2147483648` * 輸出 * 輸出兩個整數的最大公因數 ### 其他注意事項 * 在程式中求最大公因數的想法為 ==輾轉相除法== ### 程式解析 * 首先要先了解如何在程式中實現輾轉相除法 ![輾轉相除法](https://i.imgur.com/dLMmsjH.jpg =300x) 以 GCD(12,15) 為例,輾轉相除法的計算流程為 1. $15/12 = 1 ... 3$ 2. $12/ 3 = 4 ... 0$ 因此最大公因數為 `3` 從上述的計算流程可以發現輾轉相除法有以下特性: * 較大的數字除以較小的數字 * 除數在下一輪會變成被除數、餘數會變成除數 * 當發生整除的時候,最後的除數即為最大公因數 因此我們可以寫成這樣的程式計算過程 ``` python while True: if a<b: # swap(a,b) 兩個變數的值 a, b = b, a if b!=0: c = a%b a = b b = c else: break ``` 設計一個無限迴圈 while True 反覆調整 a, b, c 三個變數的值,其中 a, b, c 為被除數、除數和餘數的關係 進行餘數計算前必須先判斷 a, b 兩數的大小,若發生 a<b 的情況 則需要將 a,b 兩數進行交換(swap) ### 完整程式碼 (僅提供參考) ``` python=01 def GCD(a, b): while True: if a<b: a, b = b, a if(b != 0): c = int(a%b) a = b b = c else: break # 若滿足 break 條件,則 a 經過 Line8 調整後會是最大公因數 return a #start s = input() data = s.split() a = int(data[0]) b = int(data[1]) r = GCD(a, b) print(r) ``` ###### tags: `基礎15題解` `APCS` `ZeroJudge`