最常见的多个Javascript代码

时间:2016-01-28 22:44:18

标签: javascript

我一直在寻找有关SO的解释,但我只是在其他编程语言中找到了对我来说不太清楚的答案。

我怀疑它背后的数学是我没有得到的,因为代码很清楚,但如果有人不介意解释,我会感激不尽。

(我在那里添加了评论,试图向我自己解释发生了什么,所以如果他们错了,那也很好。)

已编辑添加:预期输入是两个数字的数组。任务是找到这两个值之间所有数字的最小公倍数。知道可能很重要。抱歉。

function smallestCommons(arr) { 
    var i = Math.min(arr[0], arr[1]);
    var j = Math.max(arr[0], arr[1]);
    var resultArr = [];

    // make an array of the numbers from high to low
    while (j >= i) {
        resultArr.push(j);
        j--;
    }

    return resultArr.reduce(function(x, y) {
        var a = x, 
            b = y, 
            t = 0; 

        // while a is not evenly divisible by b
        while (a % b) { 
            a = a % b;  // a is the remainder
            t = a;      // t is the remainder
            a = b;      // a is now the divisor
            b = t;      // the divisor is now the remainder
        }
        return (x / b) * y; 
    }); 
}

2 个答案:

答案 0 :(得分:1)

此评论并不正确。这一行创建了i和j之间的数字数组,从高到低排序。也就是说,如果你有array = [1,10],resultArr将是[10,9,8,7,6,5,4,3,2,1]。

真的,你所拥有的是第一个和第二个数字之间的差异。这是欧几里得算法中寻找GCD(最大公共分母)的第一步

第二部分是一步计算gcd以及计算素因子并得到它们的乘积。

答案 1 :(得分:0)

使用此代码

function leastCommonMultiple(min, max) {
function range(min, max) {
    var arr = [];
    for (var i = min; i <= max; i++) {
        arr.push(i);
    }
    return arr;
}

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

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

var multiple = min;
range(min, max).forEach(function(n) {
    multiple = lcm(multiple, n);
});

return multiple;
}

leastCommonMultiple(1, 13); // => 360360