我读了二进制gcd算法并尝试实现它。它工作了。这是我的代码
int gcd2(int a, int b) {
int sh;
if (a == 0)
return b;
if (b == 0)
return a;
for (sh = 0; !((a | b) & 1); sh++) {
a >>= 1;
b >>= 1;
}
while (!(a & 1)) {
a >>= 1;
}
while(b) {
while (!(b & 1)) {
b >>= 1;
}
if (a > b) {
int t = a;
a = b;
b = t;
}
b = b - a;
}
return a << sh;
}
但如果我用
替换最后一个if,那么它是不行的 if (b > a)
{
int t = a;
a = b;
b = t;
}
b = a -b;
我只是认为两者都应该有效,因为它们也在做同样的事情。但它并不起作用。 有人能解释一下吗?
提前致谢!
答案 0 :(得分:1)
它不一样:如果你选择第二种方式,那么总有可能比b更大。然后你永远不会得到svap变量,而b总是小于a b = a-b之后,如果b是正数
我认为使用
a=a-b
而不是
b=a-b
可以做到