方法一: 使用最小公倍数和最小公约数的关系
最大公约数的获取方法是经典的辗转相除法
var comMin = function(a,b){
var start = Math.max(a,b),end = Math.min(a,b);
while(end){
start = start%end;
if(start===0){
return end;
}
end = end%start;
}
return start;
}
最小公倍数=两个数的乘积/最打公约数
var comMax = function(a,b){
return a*b/comMin(a,b);
};
两个数字和直接的所有数字的最小公倍数
var comRangMax = function(a,b){
var start = Math.min(a,b),end = Math.max(a,b);
var com = start;
while(start<end){
com = comMax(com,++start);
}
return com;
};
方法二:因式分解
找到不超过制定数字的所有素数
var primes = function(num){
var ps = [],
j = 0,
isPrime = false;
var arr = (new Array(num-1)).join("-").split("-").map(function(i,idx){
return idx+2;
});
for(var i=0;i<arr.length;i++){
isPrime = true;
for(j=0;j<ps.length;j++){
if(0==arr[i]%ps[j]){
isPrime = false;
break;
}
}
if(isPrime){
ps.push(arr[i]);
}
}
return ps;
};
对数字做饮食分级恩,所有因数的乘积就是最小公倍数
var comMax = function(a,b){
var end = Math.max(a,b);
var arr1 = primes(end);
var arr2 = arr1.map(function(a){
return 1;
});
var handled = false;
for(var i=0;i<arr1.length;i++){
if(a===1&&b===1){
break;
}
while(true){
handled = false;
if(a%arr1[i]===0){
handled = true;
a = a/arr1[i];
}
if(b%arr1[i]===0){
handled = true;
b=b/arr1[i]
}
if(handled){
arr2[i] *= arr1[i];
}else{
break;
}
}
}
return arr2.reduce(function(a,b){
return a*b;
});
};
两个数字和直接的所有数字的最小公倍数
var comRangeMax = function(a,b){
var start = Math.min(a,b),end = Math.max(a,b);
var arr1 = primes(end);
var arr2 = arr1.map(function(i){
return 1;
});
var nums = (new Array(end-start+1)).join("-").split("-").map(function(i,idx){
return start+idx;
});
var handled = false,j;
for(var i=0;i<arr1.length;i++){
if(a===1&&b===1){
break;
}
total = 1;
while(true){
handled = false;
total = 1;
for(j=0;j<nums.length;j++){
if(nums[j]<arr1[i]){
continue;
}
if(nums[j]%arr1[i]===0){
handled = true;
nums[j] = nums[j]/arr1[i]
}
total = total>1?total:total*nums[j];
}
if(handled){
arr2[i] *= arr1[i];
}else{
break;
}
}
if(total===1){
break;
}
}
return arr2.reduce(function(a,b){
return a*b;
});
};
结果对比:
使用上述方法分别执行如下代码:
var n=new Date(),count = 10000;
while(count--){
comRangeMax(16,31);
}
console.log(new Date()-n);
方法一使用事件10毫秒
方法二使用事件205毫秒