最大公因數

寫一個程式,輸入兩個正整數 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 為例,把執行過程中每一次迴圈的變化列出來:

次數abc
09640?
1401616
21688
3800

由上表可以得知,第三次迴圈執行完, b 即為 0,於是結束該迴圈,這時最大公因數即為 8。

 

转载于:https://www.cnblogs.com/liwenbin/archive/2012/07/06/2579267.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值