JS如何找到最大公约数

IT技术 javascript math greatest-common-divisor
2021-03-04 19:10:36

我想使用 JavaScript 找到最大公约数。

有谁以前做过并愿意分享吗?

3个回答

这是一个递归解决方案,使用欧几里得算法。

 var gcd = function(a, b) {
  if (!b) {
    return a;
  }

  return gcd(b, a % b);
}

我们的基本情况是何时b等于0在这种情况下,我们返回a

当我们递归时,我们交换输入参数,但我们将 的其余部分a / b作为第二个参数传递

@FlorianF:既然 ES2015(又名 ES6)规范需要尾调用优化,一旦引擎达到规范,它就不再是递归了。:-)
2021-04-24 19:10:36
他没有问。我想警告人们不要在现实生活中的程序中使用这种方法。
2021-04-28 19:10:36
递归不是最快的。
2021-05-11 19:10:36
@FlorianF 好的,谢谢。我错过了 OP 要求尽可能最快的解决方案的地方。
2021-05-11 19:10:36
这段代码可以用一行写成var gcd = function(a,b) { return (!b)?a:gcd(b,a%b); };顺便说一下,不错的解决方案,+1
2021-05-19 19:10:36

摘自维基百科。

递归:

function gcd_rec(a, b) {
    if (b) {
        return gcd_rec(b, a % b);
    } else {
        return Math.abs(a);
    }
}

迭代:

function gcd(a,b) {
    a = Math.abs(a);
    b = Math.abs(b);
    if (b > a) {var temp = a; a = b; b = temp;}
    while (true) {
        if (b == 0) return a;
        a %= b;
        if (a == 0) return b;
        b %= a;
    }
}
  • 根据用户的评论编辑
if (a < 0) a = -a;你也可以这样做a = Math.abs(a);(下一行相同)
2021-04-24 19:10:36
function egcd(a, b) {
    if (a == 0)
        return b;

    while (b != 0) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }

    return a;
}
请添加对您的代码的解释。
2021-05-14 19:10:36