1. 程式人生 > >W3Cschool中級指令碼演算法(15.最小公倍數演算法挑戰)

W3Cschool中級指令碼演算法(15.最小公倍數演算法挑戰)

最小公倍數演算法挑戰

問題:

找到所提供引數的最小公倍數,這兩個引數可以均勻分配,以及這些引數之間範圍內的所有最小公倍數。

範圍是兩個數字構成的陣列,兩個數字不一定按數字順序排序。

例如對 1 和 3 —— 找出能被 1 和 3 和它們之間所有數字整除的最小公倍數。

要求:

smallestCommons([1, 5]) 應該返回一個數字。

smallestCommons([1, 5]) 應該返回 60。

smallestCommons([5, 1]) 應該返回 60。

smallestCommons([1, 13]) 應該返回 360360。

問題答案:

  //分解質因數法,分解為若干個質數相乘
  var arrratio=[];
  var min=Math.min(arr[0],arr[1]);
  var max=Math.max(arr[0],arr[1]);
  for(var i=min+1;i<max;i++){
    arr.push(i);
  }
  //找出小於max的所有質數
  var arrtemp=[];
  for(var j=2;j<=max;j++){
    arrtemp.push(j);
  }
  var prime=arrtemp.filter(function(val){
    for(var k=2;k<val;k++){
      if(val%k===0){
        return false;
      }
    }
    return true;
  });
  //用這一排數分別除以從小到大的質數,如果某個數能除盡,則把那個數變為除後的數,把這個質數放在arrratio數組裡備用。直至arr裡每個數都變成1。這個方法是分解質因數法,詳情見小學或初中課本。
  while(arr.reduce(function(a,b){return a+b;})!==(max-min+1)){
    for(var m=0;m<prime.length;m++){
      var isratio=0;
      for(var n=0;n<arr.length;n++){
        if(arr[n]%prime[m]===0){
          isratio=1;
          arr[n]=arr[n]/prime[m];
        }
      }
      if(isratio){
        arrratio[arrratio.length]=prime[m];
      }
    }
  }
  //最後把arrratio數組裡的數相乘便是這一組數的最小公倍數。
  return arrratio.reduce(function(a,b){return a*b;});

題目連結: