最小公倍数算法挑战
问题:
找到所提供参数的最小公倍数,这两个参数可以均匀分配,以及这些参数之间范围内的所有最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 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;});
题目链接:
https://www.w3cschool.cn/codecamp/smallest-common-multiple.html