其实所谓的二进制算法:
通过不断去除因子2来降低常数。
<1> x == y -------> GCD(x, y) = x;
<2> x != y
(1) x,y均为偶数,则GCD(x,y) = 2 * GCD(x / 2, y / 2);
(2) x为偶数,y为奇数,则GCD(x,y) = GCD(x / 2, y);
(3) x为奇数,y为偶数,则GCD(x,y) = GCD(x, y / 2);
(4) x,y均为奇数,GCD(x, y) = GCD(x - y, y);
#include<cstdio>
int a, b, c;
int GCD(int a, int b){
int i, j;
if(a == 0) return b;
if(b == 0) return a;
for (i = 0; 0 == (a & 1); ++i) a >>= 1;
for (j = 0; 0 == (b & 1); ++j) b >>= 1;
if(j < i) i = j;
while(1){
if(a < b) {a ^= b; b ^= a; a ^= b;}
if(0 == (a -= b)) return b << i;//辗转相减
while(0 == (a & 1)) a >>= 1;
}
}
int main(){
scanf("%d%d", &a, &b);
c = GCD(a, b);
printf("%d", c);
return 0;
}