解法一:
辗转相除法,使用原理为f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,则x=ky+b,如果一个数能够同时整除x和y,则必能同时整除b和y,而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数相同的,其最大公约数也是相同的,则有f(x,y)=f(y,x%y)(y>0).
具体代码如下:
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和y的公约数与x和y的公约数相同的.如果x<y,可以先交换(x,y).因为(x,y)=(y,x)。
代码如下:
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);
}
}
}
原文地址:http://blog.csdn.net/wangfengfan1/article/details/45154857