gcd的二进制优化笔记
可将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; } }