1、辗转相除法
int gcd1(int x, int y)
{
if(y == 0)
return x;
else
return gcd1(y, x % y);
}
2、辗转相减法
int gcd2(int x, int y)
{
if(x < y)
return gcd2(y, x);
if(y == 0)
return x;
else
return gcd2(x-y,y);
}
3、优化
//若x,y均为偶数,f(x,y)= 2*f(x/2,y/2)= 2*f(x>>1,y>>1)
//若x为偶数,y为奇数,f(x,y) = f(x/2,y) = f(x>>1,y)
//若x为奇数,y为偶数,f(x,y) = f(x, y/2) = f(x, y>>1)
//若x,y均为奇数,f(x,y) = f(y,x-y),x-y是一个偶数
int gcd3(int x, int y)
{
if(x < y)
return gcd3(y,x);
if(y == 0)
return x;
else
{
if(x & 1 == 0)
{
if(y & 1 == 0)
return (gcd3(x >> 1, y >> 1) << 1);
else
return (gcd3(x >> 1, y));
}
else
{
if(y & 1 == 0)
return gcd3(x, y >> 1);
else
return gcd3(y, x - y);
}
}
}