您的位置:首页 > 其它

求两个数的最大公约数

2016-04-13 23:00 204 查看

两个数的最大公约数

辗转反除法

对应公式:f(x, y) = f(y, x%y),其中x>=y>0。

程序实现如下:

int gcd1(int x, int y)
{
if (x < y)
return gcd1(y, x);
return (!y) ? x : gcd1(y, x % y);
}


大整数减法

因辗转反除法利用取模运算,计算开销大,故转换为大整数减法实现。

对应公式:f(x, y) = f(x-y, y),其中x>=y>0。

程序实现如下:

int gcd2(int x, int y)
{
if (x < y)
return gcd2(y, x);
return (!y) ? x : gcd2(x - y, y);
}


位运算

由于辗转反除法计算复杂,而大整数减法虽计算不复杂,但迭代次数太多,故分析公约数特点,利用位运算实现。

对应公式:

1)x,y均为偶数,f(x, y)=2*f(x/2, y/2)=f(x>>1, y>>1)<<1

2)仅x为偶数,f(x, y)=f(x/2, y)=f(x>>1, y)

3)仅y为偶数,f(x, y)=f(x, y/2)=f(x, y>>1)

4)x,y均为奇数,f(x,y)=f(y, x-y)

其中x>=y>0。

实现程序如下:

int gcd3(int x, int y)
{
if (x < y)
return gcd3(y, x);
if (y == 0)
return x;
else
{
if (x % 2 == 0)
{
if (y % 2 == 0)
return (gcd3(x >> 1, y >> 1) << 1);
else
return gcd3(x >> 1, y);
}
else
{
if (y % 2 == 0)
return gcd3(x, y >> 1);
else
return gcd3(x - y, y);
}
}
}


参考文献:编程之美
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最大公约数