方法一:
//公式法
var lcm = function() {
//求最大公约数
//辗转相除法
function gcd(a, b) {
if (a == 0)
return b;
return gcd(b % a, a);
}
//Reduce的思路
//依次求最小公倍数
return Array.prototype.slice.apply(arguments).reduce(
function(a, b) {
return a * b / gcd(a, b);
}, 1);
};
方法二:
//质因数分解法
var primeFactors = function(num){
//用hash保存质因数及其个数
var hash = {};
//分解质因数
while(num > 1){
for(var i=2;i<=num;i++){
if(num % i === 0){
hash[i] ? hash[i]++ : hash[i] = 1;
num /= i;
break;
}
}
}
return hash;
};
var lcm = function () {
//汇合到一个hash
var totalHash = {};
var res = 1;
for(var i=0;i<arguments.length;i++){
var cur = arguments[i];
//存在非自然数,就返回0
if(cur < 1){
return 0;
}
var curHash = primeFactors(cur);
//汇总
for(var j in curHash){
if(!totalHash[j] || totalHash[j] < curHash[j]){
totalHash[j] = curHash[j];
}
}
}
//统一计算乘积
for(var key in totalHash){
res *= Math.pow(key, totalHash[key]);
}
return res;
};