我正在尝试编写一个函数,该函数接受两个数字并返回最小公倍数,该最小公倍数也可被这些数字之间的所有数字整除,但我得到的结果仅适用于1,1到1,12,但是由于某种原因在1,13停止工作。其他设置(例如12,14)可以工作,但我不知道原因或模式是什么。

function smallestCommons(arr) {
    arr.sort(function(a, b) {
        return a-b;
    });
    var arr1 = [];
    var arr2 = [];
    for (var k = arr[0]; k<=arr[1]; k++) {
        arr1.push(k);
    }
    function remainder(val1, val2) {
        return val1%val2;
    }
    var b = arr1.reduce(function(a, b) {
        return a*b;
    });
    var i = arr1[arr1.length-1]*arr1[arr1.length-2];
    while (i<=b) {
        for (var m = 0; m<arr1.length; m++) {
            var a = remainder(i, arr1[m]);
            arr2.push(a);
        }
        var answer = arr2.reduce(function(c, d) {
           return c+d;
        });
        if (answer === 0) {
            return i;
        } else {
            arr2 = [];
            i++;
        }
    }
}

最佳答案

我想您可以在JavaScript中执行以下操作;它可以在不到0.25毫秒的时间内计算出最多216个项目的公共(public)LCM,例如[1,2,3,...,216]

function gcd(a,b){
  var t = 0;
  a < b && (t = b, b = a, a = t); // swap them if a < b
  t = a%b;
  return t ? gcd(b,t) : b;
}

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

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13],
    brr = Array(216).fill().map((_,i) => i+1), // limit before Infinity
 result = arr.reduce(lcm);
console.log(result);
console.time("limit");
result = brr.reduce(lcm);
console.timeEnd("limit");
console.log(result);

09-11 00:37