任务:求数组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;
}