数字混乱的GCD

时间:2017-05-13 15:50:40

标签: c++ greatest-common-divisor

我正在寻找用于计算2个数字的gcd的简单代码,并且遇到了这个有效的代码

ll gcd(ll a, ll b){
  return b ? gcd(b,a%b):a;
}

我试图让这段代码正常工作

ll gcd(ll a, ll b){
  return a ? gcd(a%b,b):b;
}

无论我做什么,我都无法使第二个代码块工作。我的理由很简单,无论我如何开始,我都应该能够获得GCD。有人可以帮我理解我哪里错了吗?

1 个答案:

答案 0 :(得分:1)

如果您要交换ab,您必须做两件事:

  • 将每个a替换为b,将每个b替换为a
  • 将传递给每个递归调用的参数的顺序更改为gcd

你已经部分完成了。你需要做的是:

return a ? gcd(b%a, a):b;

您拥有的内容会产生无限递归。例如,如果使用修改后的函数调用gcd (12, 8),则这是您在每次迭代时获得的结果:

a = 12, b = 8
a = 4, b = 8
a = 4, b = 8
a = 4, b = 8
...