时间:2016-07-16 04:30:18

标签: javascript algorithm lcm

我正在使用JavaScript,我正在为最小的公共倍数求解两个数字,并且最小的公共倍数必须可以被两个数字之间的所有数字整除。

现在,我的代码根本没有工作,也没有返回任何内容。我有一个函数来计算最小公倍数和第二个函数来确定该倍数是否可被最小和最大数字之间的数字整除。

function smallestCommons(arr) {

    var max = 0;
    var min = 0;
    var lcm = 0;
    var max2 = 0;
       if(arr[0]> arr[1]) {
         max = arr[0];
         min = arr[1];
       } else {
         max = arr[1];
         min = arr[0];
       }

       function range(item){
         for(var j = min+1; j < max; j++){
           if(item % j !== 0){
             return 0;
           } else {
             return item;
           }
         }
       }   
       function lcmFind(min1, max1){
         for(var i =1; i < min1; i++){
             max1 = max1 * i;

             if(range(max1) === 0){
               continue;
             } else {
               return range(max1);
             }       
           }  
         }         
       return lcmFind(min,max);    
     }
     smallestCommons([1,5]);

1 个答案:

答案 0 :(得分:6)

您正在寻找lcm或最小公倍数。碰巧lcm(a, b) = a * b / gcd(a, b)其中gcd是最大公约数,两个数都是其倍数的最大数。有一种叫做欧几里德算法的算法可以快速计算gcd:gcd(a, b) = gcd(b, a % b),其中a%ba modulo b。在javascript中,就是这个。

function gcd(a, b) {
    if (b == 0) {
        return a; // so that the recursion does not go on forever
    } else {
        return gcd(b, a % b);
    }
}

然后,您可以像这样定义lcm。

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

编辑:为了计算数字列表的lcm,只需使用lcm函数减少。因此,为了计算范围内所有数字的lcm,此代码将起作用。 (假设范围包含2个参数)

function lcmOfRange(a, b) {
    var range = [];
    for (var i = a; i <= b; i++) {
        range.push(i);
    }
    return lcmOfList(range);
}

function lcmOfList(arr) {
    return arr.reduce(lcm);
}

这相当于

function lcmOfRange(a, b) {
    var result = a;
    for (var i = a + 1, i <= b; i++) {
        result = lcm(result, i);
    }
    return result;
}