寫一個程式,輸入兩個正整數 A、B,印出它們的最大公因數。例如:
輸入1:96 40
輸出1:8
輸入2:120 160
輸出2:40
首先我們先用最簡單的方法,也就是從 A、B 兩數比較小的那個數開始,每次遞減一,直到一為止,一一測試是否可以同時將 A、B 整除,如果可以,則找到最大公因數,並不用再往下測試了。程式如下:
int a, b, c, i;
cin >> a >> b;
if(a>b) c=b;
else c=a;
for (i=c; i>=1; i--) {
if ( (a%i==0) && (b%i==0) ) break;
}
cout << i << endl;
以上的方法,雖然不是最有效率的,卻是最簡單的。像這種一個一個試,不太使用大腦的方法,我們稱之為「暴力法」。
接下來我們看到比較有效率一點的方法,也就是利用數學裡的輾轉相除法來求它們的最大公因數。輾轉相除法的原理是,如果 A 除以 B 的餘數為 C,則 A、B 的最大公因數和 B、C 的最大公因數是相同的,而如果 B 除以 C 的餘數為 D,則 B、C 的最大公因數等於 C、D 的最大公因數。如此反覆下去,直到餘數為 0,則最後那一個不為 0 的餘數則為 A、B 的最大公因數。
首先,我們先輸入兩個數,然後如果 B 大於 A,則先將兩個數對調,程式如下:
int a, b, c;
cin >> a >> b;
if(a<b) {
c=b;
b=a;
a=c;
}
上面的程式中,我們利用變數 c 來當暫存變數,讓 a、b 兩個變數的值可以對調。接下來,我們反覆執行下面的動作:
while( b!=0 ) {
c=a%b;
a=b;
b=c;
}
上面的程式,我們先取 a 除以 b 的餘數並把它存到 c,因為 a、b 的最大公因數和 b、c 的最大公因數一樣,所以把 b 的值給 a,再把 c 的值給 b,如此反覆下去,直到 b 變成 0 為止,則這時的 a 就是我們要求的最大公因數。這時 b!=0 的條件不再成立,於是跳出這個迴圈。最後,我們再把結果印出來:
cout << a << endl;
下面我們以 96、40 為例,把執行過程中每一次迴圈的變化列出來:
次數 a b c 0 96 40 ? 1 40 16 16 2 16 8 8 3 8 0 0 由上表可以得知,第三次迴圈執行完, b 即為 0,於是結束該迴圈,這時最大公因數即為 8。