輾轉相除法的原理
輾轉相除法是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。這個和更相減損術有著異曲同工之處。
原理:
首先介紹下更相減損術的原理,假設有兩個數161和63,我們要求這兩個數的最大公因數,不妨假定這個最大公因數為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))
相關文章
- 輾轉相除法原理
- 輾轉相除法原理解析
- 輾轉相除法
- 證明:輾轉相除法與更相減損術
- C++中的輾轉相除法C++
- 輾轉相除法 氣泡排序排序
- 透徹理解輾轉相除法
- 【C語言】聊聊輾轉相除法C語言
- 輾轉相除法與更相減損術(求最大公約數)
- 求最大公約數(輾轉相除法)
- 輾轉相除法(歐幾里得演算法)(gcd)模板及其原理演算法GC
- 【演算法分析與設計】輾轉相除法演算法
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- [待更新]歐幾里得演算法(輾轉相除法)與擴充歐幾里得演算法演算法
- 除法與GCD演算法的相關分析GC演算法
- 相機成像原理
- Oracle Freelist和HWM原理探討及相關效能優化(轉)Oracle優化
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- 轉移指令的原理
- [轉帖]基礎篇:JVM調優原理相關的知識和經驗分享JVM
- Elasticsearch——document相關原理Elasticsearch
- ASEMI三相整流橋的工作原理
- 【leetcode】29. Divide Two Integers 不能使用乘除法的整數除法LeetCodeIDE
- Webpack相關原理淺析Web
- vue原理相關總結Vue
- 轉置原理
- 求 PHP 轉 java 的相關教程PHPJava
- JavaScript / 除法運算子JavaScript
- 除法謎題(2)
- 除法謎題(1)
- 多項式除法
- android kotlin 安全除法AndroidKotlin
- scss不能用除法?CSS
- 三相非同步電動機星三角+正反轉電路圖原理非同步
- 晶片驗證的相關概念(轉載)晶片
- Http請求相關(轉)HTTP
- Zookeeper基礎概念及相關原理
- 乘法◆除法◆謎題(7)