求两个正整数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.