輾轉相除法的原理

哈哈哈哈嘻哈從發表於2019-01-01

輾轉相除法是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。這個和更相減損術有著異曲同工之處。

原理:

首先介紹下更相減損術的原理,假設有兩個數16163,我們要求這兩個數的最大公因數,不妨假定這個最大公因數為m,我們可以將較大的數161看成63+98,63與98的和161可以被m整除,其中63也可以被m整除,自然98可以被m整除;
所以這個問題就轉換為求98和63的最大公因數m(和上面m相等)
將98看成63+35,其中63可以被m整除,和98也能被m整除,故35也可以被m整除;
所以問題進一步轉換為求35和63的最大公因數m(和上面m相等)
同理轉換為求 (63-35)=>28和35 的最大公因數
然後轉換為求28和7的最大公因數
…(一直減呀減)
後來轉換為求7和7的最大公因數
最後轉換為求7和0的最大公因數
輸出第一個數字即可;這就是相減損術的原理
我們發現求28和7的最大公約數,一直減7,一直減7…減到不能減為止。這個不斷減7的過程就是除7求餘數(即%7)
這樣我們可以將相減損術優化成輾轉相除法,上面給出了思考過程,有興趣可以百度嚴謹的證明過程。

c語言程式碼如下:

#include<stdio.h>
int gcd(int a, int b) {
 int t;
 while(b!=0) {
  t=a%b;
  a=b;
  b=t;
 }
 return a;
}
int main() {
 int a,b;
 scanf("%d%d",&a,&b);
 printf("gcd=%d\n",gcd(a,b));
 return 0;
}

同理計算最小公倍數:只要用這兩個數的乘積除以最大公因數即可
printf(“lcm=%d\n”,a*b/gcd(a,b))

相關文章