JavaScript求多个数的最小公倍数

方法一:

//公式法
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;
};
点赞