Smallest Common Multiple

解法一:
function smallestCommons(arr){
 var
tag; var max = arr[0]>arr[1]?arr[0]:arr[1]; var min = arr[0]>arr[1]?arr[1]:arr[0];
//给数组arr赋值。
 
for(var i = 0;i<=max-min;i++){ arr[i]=min+i; } //判断某个数是否是质数。
function isPrime(n){ if(n === 1){ return false; }else{ for(var i =2;i<n;i++){ if(n%i === 0){ return false; } } return true; } } var brr=[];
 //构造质数数组,质数数组最大值是传入数组的最大值。
 
for(var j =2;j<=max;j++){ if(isPrime(j)){ brr.push(j); } }  //从最大质数开始依次去除用传入数组构造的arr数组的每一项值,如果除完最小质数2后还未除尽,调用此函数。 var crr=[]; function mul(){ for(var y =0;y<arr.length;y++){ if(arr[y]%2 === 0){ arr[y]=arr[y]/2; tag = true; } } if(tag){ crr.push(2); } }
  //从最大质数开始依次去除传入数组构造的arr数组的每一项值,如果有可除的数则将质数保存到crr中,并将arr中的值改除掉后的值。
for(var x = brr.length-1;x>=0;x--){ for(var y =0;y<arr.length;y++){ if(arr[y]%brr[x] === 0){ arr[y]=arr[y]/brr[x]; tag = true; } } if(tag){ crr.push(brr[x]); } }  //判断是否除尽,如果只有两个质数(即2和3)表示已除尽。 function isDown(b){ var count; for(var z =0;z<b.length;z++){ if (isPrime(b[z])){ count += 1; } } if (count ===2){ return true; }else{ return false; } } if(!isDown(arr)){
  mul(arr);
  }


  var drr=arr.concat(crr);


  return drr.reduce(function(a,b){
    return a*b;
  });
}

 解法二:

function smallestCommons(arr) {
  var max = arr[0]>arr[1]?arr[0]:arr[1];
  var min = arr[0]>arr[1]?arr[1]:arr[0];
  var brr=[];
  function math(n){
     return n>1?n*math(n-1):1;
  }
  //return math(max);
  for(var j = min;j<=max;j++){
    for(var x=2;x<=math(max);x++){
      brr.push(j*x);
    }    
  }
  /*function compare(a,b){
    if(a<b){
      return -1;
    }else if(a>b){
      return 1;
    }else{
      return 0;
    }
  }
  brr.sort(compare);*/
  var count = 0;
  for(var i=0;i<brr.length;i++){
    var aa = brr[i];
    //return aa;
    for(var z=0;z<brr.length;z++){
      if(brr[z] === aa){
        count += 1;  
      }
    }
    /*if(brr[i] === brr[i+1]){
      count +=1;
    }else{
      count = 0;
    }*/
    if (count === max-min+1){
      return aa;
    }else{
      count= 0;
    }
  }
}

这种解法只适用于小数字,当求13个数的最小公倍数时,在第9行和第25行会出现无限循环。报错内容如下:

解法三:最大公约数法(此种最简便,速度最快)

function smallestCommons(array) {
    var range = createRange(array);

    return range.reduce(function(a, b) {
        return lcm(a, b);
    });

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

    function gcd(a, b) {
        var temp;
        while (b != 0) {
            temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    function createRange(array) {
        var range = [];
        var highest = array.reduce(function(a, b) {
            return Math.max(a, b);
        });
        var lowest = array.reduce(function(a, b) {
            return Math.min(a, b);
        });
        for (var i = lowest; i <= highest; i++) {
            range.push(i);
        }
        return range;
    }
}

 

posted @ 2017-02-20 01:43  蚂蚁不排队  阅读(130)  评论(0编辑  收藏  举报