最大公约数的简单算法

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

猜你喜欢

转载自blog.csdn.net/xiakejiang/article/details/51579856