三种解
1.辗转相除法(缺点:大整数的 除法/取模 运算开销大)
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
2.相减法(迭代多)
int gcd2(int x,int y){
if(x<y)
return gcd2(y,x);
return y==0?x:gcd2(x-y,y);
}
3 .1+2合并,利用二进制简化开销(o( long2 (max(x,y)) ))
若x,y为偶数,f(x,y)=2*f(x>>1,y>>1)
若x为偶数,y为奇数,f(x,y)=f(x>>1,y)
若x为奇数,y为偶数,f(x,y)=f(x,y>>1)
若x,y均为奇数,f(x,y)=f(x,x-y)
int gcd3(int x,int y){
if(x<y)
return gcd(y,x);
if(y==0)
return x;
else{
if(!(x&1)){
if(!(y&1))
return gcd3(x>>1,y>>1)<<1;
return gcd3(x>>1,y);
}
else{
if(!(y&1))
return gcd3(x,y>>1);
return gcd(y,x-y);
}
}
}