Algorithms.Euclid(歐幾里得演算法)
04-29
對最大公約數問題的求解演算法——歐幾里得演算法由於其很好的體現了演算法精確,輸出,有窮性等特性被用在很多演算法設計分析書籍的開篇第一個例子,但多數都只是簡單的對求解步驟用編程語言進行了複述而已,很少有人去向讀者解釋原理(雖然這也許不屬於演算法內容),本著知其然也要知其所以然的原則,接下來我將通過「正確性」,和「有窮性」兩個方面來證明歐幾里得演算法。
首先我們來看一個確切的例子:用歐幾里得演算法求158和44的最大公約數;
158=44*3+26;44=26*1+18;26=18*1+8;18=8*2+2;8=2*4+0;
得158和44的最大公約數為2. 接下來我們將其抽象:求正整數a>b得最大公約數。(鍵盤寫公式麻煩,貼上手寫過程)
圖1.
1.那麼我們如何來證明rn就是a和b得最大公約數呢?還是貼上手寫證明過程。(需要大家注意一下:若有兩個正整數m,n,我們一般將m整除n表示為m|n.)
圖2.
因此得證rn是a,b得公約數。
2.怎樣證明其是最大公約數呢?
圖3.
3.最後肯定會有人問,如何確定最終餘數一定為零呢?(即如何確定其有窮性呢)圖4.
至此我們以證明開篇得兩個問題,即證明了歐幾里得演算法。
最後附上其代碼實現
//Eculid(m,n)//使用歐幾里得演算法計算gcd(m,n)//輸入兩個不全為0得非負數整數m,n,輸出m,n得最大公約數#include <stdio.h>void Eculid(int m,int n){ int r; while(n!=0){ r=m%n; m=n; n=r; } printf("%d",m);}int main(){ int a,b; scanf("%d,%d",&a,&b); Eculid (a,b); return 0;}
推薦閱讀:
※刷題的日常Day3--翻轉鏈表
※刷題的日常Day1--從尾到頭列印鏈表
※Leetcode之旅|從了解一棵樹開始(1)
※數據結構: B-Tree 簡介及插入
※遊戲開發與程序設計知識總結03——演算法
TAG:演算法與數據結構 |