可将x,y分为六种情况进行讨论:
- 若x=0或y=0:返回y或x;
- 若x<y:交换x,y;
- 若x为偶数且y为偶数:gcd(x/2,y/2);
- 若x为偶数且y为奇数:gcd(x/2,y);
- 若x为奇数且y为偶数:gcd(x,y/2);
- 若x为奇数且y为奇数:gcd(x-y,y);
代码如下:
inline int gcd(int x,int y)
{
int n=0,m=0;
while(!(x&1)) ++n,x>>=1;
while(!(y&1)) ++m,y>>=1;
//排除之后全偶的情况
n=min(n,m);
while(1)
{
if(x<y) swap(x,y);
if(!(x-=y)) return y<<n;
while(!(x&1)) x>>=1;
}
}