1、题目:求两个正整数的最大公约数,如果两个正整数都很大,有什么简单的算法吗?
解法一:辗转相除法。
int gcd(int x, int y)
{
return (!y) ? x : gcd(y, x%y);
}
解法二:如果一个数能够同时整除x和y,则必能同时整除x-y和y。而
能够同时整除x-y和y的数也必能同时整除x和y。即x和y的公约数与x-y和y的公约数是相同的,其最大公约数也是相同的,即f(x, y) = f(x-y, y)。
BigInt gcd(BigInt x, BigInt y)
{
if(x<y)
return gcd(y, x);
if(y == 0)
return x;
else
return gcd(x-y, y);
}
解法三:利用移位运算和减法运算,避开大整数除法。
BigInt gcd(BigInt x, BigInt y)
{
if(x<y)
return gcd(y, x);
if(y == 0)
return x;
else
{
if(IsEven(x))
{
if(IsEven(y))
return (gcd(x >> 1, y >> 1) << 1);
else
return gcd(x >> 1, y);
}
else
{
if(IsEven(y))
return gcd(x, y >> 1);
else
return gcd(y, x - y);
}
}
}