求最大公约数。考虑两个正整数都很大的情况。
欧几里得辗转相除法求最大公约数:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。
如:f(42,30) = f(30,12) = f(12,18) = f(12,6) = f(6,6) = f(6,0)
即:f(x,y) = f(y, x%y) (x >= y > 0) 或f(x,y)=f(x-y, y).
解法1:直接用代码来实现辗转相除法:
int gcd(int x, int y)
{
return (!y)?x:gcd(y, x%y);
}
解法2:解法1中用到%运算,其中包含除运算,这对于大整数而言将成为算法效率的瓶颈。采用公式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);
}
解法3:结合上两种算法,并采用移位操作。