最大公约数的简单算法

来源:互联网 发布:订单管理数据流程图 编辑:程序博客网 时间:2024/06/03 21:48

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

0 0