歐幾裡德算法稱為輾轉相除法,用來求已知m、n兩個自然數的公因數。結合程序說明一下輾轉相除的具體情況。
首先看遞歸實現:
代碼如下:
int getcd(int m,int n)
{
if (m < 0 || n <0) {
return 0;
}
if(m < n)
{
int t = m;
m = n;
n = t;
}
if(m % n)
{
return getcd(n,(m % n));
}
else
{
return n;
}
}
主要計算過程分為三個步驟:
1、對輸入的兩個自然數m > n取余數r,使得0<= r < n
2、如果r為0,n即為所求結果,直接返回
3、r不為0,則賦值m=n,n=r從步驟1開始重新執行
兩自然數的公因數的定義說明了計算結果產生的條件。如果步驟1中計算出的余數r = 0,則較小的數為公因數。如果r!=0則自然數m、n的關系可表示為:m = kn + r(其中k為自然數),等式可以證明能整除m的任何數必定能整除n和r;等式進一步可變形為:r = m - kn,說明同時整除m、n的任何數也必定能整除r。也就是說,能整除m、n的數的集合與整除n、r的數的集合相等。所以輾轉相除的方法成立。
再發布一個循環實現歐幾裡德算法的版本。
代碼如下:
int getcd2(int m,int n)
{
if (m < 0 || n <0) {
return 0;
}
if(m<n)
{
int t=m;
m=n;
n=t;
}
int cd = 1;
while(1){
int r = m % n;
if(0==r)
{
cd = n;
break;
}
else {
m=n;
n=r;
}
}
return cd;
}