参考《编程之美》直接利用求余的话 对于特别大的数字计算量还是很大, 利用辗转相减递归速度太慢,所以就用下面的方法 a < b = (b,a) a,b都为偶数 则= 2*(a/2,b/2) a奇数 b偶数 =(a,b/2) a偶数 b奇数 =(a/2,b) a奇数 b奇数 =(a-b,b) |
int gcd(int a,int b){
if(a==b)
return a;
if(a<b){
return gcd(b,a);
}
if(a&1){//a为奇数
if(b&1){
return gcd(a-b,b);
}else{
return gcd(a,b>>1);
}
}else{//a为偶数
if(b&1){
return gcd(a>>1,b);
}else{
return 2*gcd(a>>1,b>>1);
}
}
}
void test1056(){
int a;
int b;
while(std::cin>>a>>b){
std::cout<<gcd(a,b)<<std::endl;
}
}