最大公约数,根据《编程之美》递归版写的非递归版:
1. 对于y和x来说,如果y=k*y1, x = k * x1。那么有gcd(y,x)=k*gcd(y1, x1);
2. 如果x=p*x1, p是素数(质数),并且y%p != 0,那么gcd(x, y) = gcd(p * x1, y) = gcd(x1, y)。
1 int gcd(int x, int y) { 2 int a = x, b = y; 3 int factor = 0; 4 while (a != 0 && b != 0) { 5 if (a < b) { 6 swap(a, b); 7 } 8 if (a & 0x01 == 0) { 9 if (b & 0x01 == 0) {10 b >>= 1;11 factor++;12 } 13 a >>= 1;14 } else {15 if (b & 0x01 == 0) {16 b >>= 1;17 } else {18 a -= b;19 }20 } 21 }22 if (a == 0) return b << factor;23 if (b == 0) return a << factor;24 }