二进制GCD不工作

binary gcd not working

本文关键字:工作 GCD 二进制      更新时间:2023-10-16

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

我只是认为两者应该工作,因为他们是做同样的。但这行不通。有人能解释一下吗?

提前感谢!

这是不一样的:如果你选择第二种方式,有可能a总是比b大,那么你就永远不能交换变量,并且b总是小于b=a-b,如果b是正数

我想使用

a=a-b
不是

b=a-b

可以