最大公約數的簡單演算法
阿新 • • 發佈:2018-12-30
求兩個正整數x和y的最大公約數。(如果兩個正整數都很大,有什麼簡單的演算法嗎?)
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main(){
int max_gongyueshu, x, y;
int gcd(int, int);
cout << "輸入x和Y:" << endl;
cin >> x >> y;
max_gongyueshu = gcd(x, y);
cout << "max_gongyueshu is " << max_gongyueshu << endl;
return 0;
}
int gcd(int x, int y){
if (x < y) //若x<y,先交換,避免一個正數和一個負數的最大公約數的出現
return gcd(y, x);
if (y == 0)
return x; //一直迭代下去,直到其中一個數為0
else
return gcd(x - y, y);
}
分析:最簡單的求最大公約數演算法是歐幾里得的輾轉相除法,但是對於大數取模運算,開銷非常大。如果一個數能夠同時整除y和x,則必能同時整除x-y和y;而能夠同時整除x-y和y的數也必能同時整除x和y,即x和y的最大公約數與x-y和y的最大公約數是相同的。即f(x,y)=f(x-y,y),那麼就可以換成簡單的多的大整數的減法。一直迭代下去,直到其中一個數為0,如f(42,30)=f(12,30)=f(30,12)=f(18,12)=f(6,12)=f(12,6)=f(6,6)=f(6,0)=6.