1. 程式人生 > >最大公約數的簡單演算法

最大公約數的簡單演算法

求兩個正整數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.