本题为编程之美中的第2.7题,上面的解法比辗转相除发的时间复杂度要小很多。看完之后用while循环代替了递归重写了一下。
废话少说,上源码:
1 #include2 using namespace std; 3 4 int GDC(unsigned long long x, unsigned long long y) 5 { 6 unsigned long long deep = 1; 7 while(y != 0) 8 { 9 if (x < y) 10 { 11 x ^= y; 12 y ^= x; 13 x ^= y; 14 continue; 15 } 16 if (x & 0x01 == 0) 17 { 18 if (y & 0x01 == 0) 19 { 20 x >>= 1; 21 y >>= 1; 22 deep <<= 1; 23 } 24 else 25 { 26 x >>= 1; 27 } 28 } 29 else 30 { 31 if (y & 0x01 == 0) 32 { 33 y >>= 1; 34 } 35 else 36 { 37 unsigned long long temp = x - y; 38 x = y; 39 y = temp; 40 } 41 } 42 } 43 return deep * x; 44 } 45 46 int main() 47 { 48 int result = GDC(24, 42); 49 cout << result; 50 return 0; 51 }
运行结果:
24 和 42 的最大公约数 为 6。