求两个数的公约数优化的代码
考虑时间开销,没用取模运算;考虑栈空间开销,用循环代替递归。
#include <stdio.h>
int IsEven(int x)
{
return !(x & 1);
}
int gcd(int x, int y)
{
if (y == 0) {
return x;
}
int dividend, divisor;
if (x < y) {
dividend = y;
divisor = x;
} else {
dividend = x;
divisor = y;
}
int multi = 1;
while (divisor) {
if (IsEven(dividend)) {
dividend >>= 1;
if (IsEven(divisor)) {
multi *= 2;
divisor >>= 1;
}
} else {
if (IsEven(divisor)) {
divisor >>= 1;
} else {
int tmp = dividend;
dividend = divisor;
divisor = tmp - divisor;
}
}
if (dividend < divisor) {
int tmp1 = dividend;
dividend = divisor;
divisor = tmp1;
}
}
return multi * dividend;
}
int main()
{
printf("input two int ,dividend and divisor\n");
int dividend, divisor;
scanf("%d %d", ÷nd, &divisor);
printf("gcd:%d\n", gcd(dividend, divisor));
}