本题为编程之美中的第2.7题,上面的解法比辗转相除发的时间复杂度要小很多。看完之后用while循环代替了递归重写了一下。
废话少说,上源码:
#include <iostream>
using namespace std;
int GDC(unsigned long long x, unsigned long long y)
{
unsigned long long deep = 1;
while(y != 0)
{
if (x < y)
{
x ^= y;
y ^= x;
x ^= y;
continue;
}
if (x & 0x01 == 0)
{
if (y & 0x01 == 0)
{
x >>= 1;
y >>= 1;
deep <<= 1;
}
else
{
x >>= 1;
}
}
else
{
if (y & 0x01 == 0)
{
y >>= 1;
}
else
{
unsigned long long temp = x - y;
x = y;
y = temp;
}
}
}
return deep * x;
}
int main()
{
int result = GDC(24, 42);
cout << result;
return 0;
}
运行结果:24 和 42 的最大公约数 为 6。