二进制gcd算法 - 不工作

时间:2014-08-18 18:34:59

标签: c++ algorithm binary greatest-common-divisor

我读了二进制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;

我只是认为两者都应该有效,因为它们也在做同样的事情。但它并不起作用。 有人能解释一下吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

它不一样:如果你选择第二种方式,那么总有可能比b更大。然后你永远不会得到svap变量,而b总是小于a b = a-b之后,如果b是正数

我认为使用

a=a-b

而不是

b=a-b

可以做到