使用欧几里得算法计算数组值的最小公倍数

5
我希望能使用欧几里得算法计算数值数组的最小公倍数。
我正在使用此伪代码实现:在维基百科上找到。
function gcd(a, b)
    while b ≠ 0
       t := b; 
       b := a mod b; 
       a := t; 
    return a;

我的JavaScript实现如下所示

function smallestCommons(arr) {

  var gcm = arr.reduce(function(a,b){

    let minNum = Math.min(a,b);
    let maxNum = Math.max(a,b);
    var placeHolder = 0;

    while(minNum!==0){
        placeHolder = maxNum;
        maxNum = minNum;
        minNum = placeHolder%minNum;
    } 

    return (a*b)/(minNum);
  },1);

  return gcm;
}


smallestCommons([1,2,3,4,5]);

我在while循环中遇到了错误。

无限循环。

编辑 在gcm函数的末尾进行了一些更正,我使用了0作为初始值,但实际上应该是1,因为你不能从0开始求最大公约数。

编辑2 期望的输出结果应该是60,因为1、2、3、4、5的最小公倍数为60。

2个回答

32

使用ES6

const gcd = (a, b) => a ? gcd(b % a, a) : b;

const lcm = (a, b) => a * b / gcd(a, b);

然后在给定的整数数组上使用reduce函数:

[1, 2, 3, 4, 5].reduce(lcm); // Returns 60

使用ES5

var gcd = function (a, b) {
    return a ? gcd(b % a, a) : b;
}

var lcm = function (a, b) {
    return a * b / gcd(a, b);
}

然后在给定的整数数组上使用reduce:

[1, 2, 3, 4, 5].reduce(lcm); // Returns 60

3
因为简短明了而美丽,我认为这是最好的答案。 - Avatar
我真的很喜欢ES6版本的简洁性!做得好,Елин Й.! - Jan Molak
超级干净的解决方案,我非常印象深刻 :) - Pete - iCalculator

3
你是不是故意把所有变量和运算符顺序都搞乱了?;-)
  while(minNum!==0){
        placeHolder = minNum;
        minNum = maxNum % minNum;
        maxNum = placeHolder;
    } 

    //here maxNum = GCD(a,b)

    return (a*b) / (maxNum);  //LCM

可能是因为我在观看视频后编写了公式,然后查看了维基百科。 - Vincent Tang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接