JS求最小公倍数(高效算法2—利用最大公约数和递归调用)

任务:求数组arr[]中所有数据的最小公倍数。

任务解析:

        求数组所有数据的最小公倍数,可以先将问题简化为求两个正整数的最小公倍数,再通过递归或数组累加器来求出最后结果。

        而求两个正整数a,b的最小公倍数c,可先求出最大公约数d,则最小公倍数就显而易见c=a*b/d;

       求最大公约数的方法参见:https://my.oschina.net/flyyourdream/blog/867327

JS算法实现:

//算法:利用最大公约数求两整数的最小公倍数
function twoSmallestCommonMultiple(a,b){
  var c=mostCommonDivisor(a,b);
  return a*b/c;
}
//算法:辗转相减法求两个整数的最大公约数
function mostCommonDivisor(a,b){
	var c=Math.min(a,b);
		a=Math.max(a,b);
		b=c;
	if(b===0){
		return  alert("error,please input a number bigger than zero");
	}
	var c=a-b;
	while(c>0){
		a=Math.max(b,c);
		b=Math.min(b,c);
		c=a-b;
	}
	return b;
} 
//使用函数调用和递推的方式求数组所有元素的最小公倍数
function smallestCommonMultiple(arr){
	if(arr.length<2){
		return arr[0];
	}
	var a=0;
	var result=1;
	for(var i=0;i<arr.length;i++){
		result=twoSmallestCommonMultiple(result,arr[i]);
	}
	return result;
}

      上述smallestCommonMultiple(arr),也可以使用Arr.prototype.reduce()累加器进行计算,具体实现方式如下:

function smallestCommonMultiple(arr){
	if(arr.length<2){
		return arr[0];
	}
	var a=0;
	var result=arr.reduce(function(acc,val){
		return twoSmallestCommonMultiple(acc,val);
	},1);
	return result;
}

      

       

    

 

 

转载于:https://my.oschina.net/flyyourdream/blog/867338

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值