/*
二进制求最大公约数。
由于传统的GCD,使用了%,在计算机运行过程中
要花费大量的时间,所以,采取二进制的求法,来减少时间的消耗。
算法:
当a,b都是偶数时: gcd(a,b)=2*gcd(a/2,b/2);
当a,b一奇一偶时: if(a&1) gcd(a,b)=gcd(a,b/2);
else gcd(a,b)=gcd(a/2,b);
当a,b都是奇数时: if(a>b)
gcd(a,b)=gcd( (a-b)/2, b);
else
gcd(a,b)=gcd( a,(b-a)/2);
其实就是把偶数的/2,而且奇数-奇数=偶数。
*/
1 #include<stdio.h> 2 3 int Binary_GCD(int a,int b) 4 { 5 int c=1; 6 while(a-b) 7 { 8 if(a&1) 9 { 10 if(b&1) 11 {//都是奇数 12 if(a>b) a=(a-b)>>1; 13 else b=(b-a)>>1; 14 } 15 else //一奇数一偶数 16 b=b>>1; 17 } 18 else//a 是偶数 19 { 20 if(b&1) a=a>>1; 21 else 22 { 23 c=c<<1;b=b>>1;a=a>>1; 24 } 25 } 26 } 27 return c*a; 28 } 29 30 int main() 31 { 32 int n,m; 33 while(scanf("%d%d",&n,&m)>0) 34 { 35 printf("%d ",Binary_GCD(n,m)); 36 } 37 return 0; 38 }