题目
找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。
如果你被卡住了,记得开大招 Read-Search-Ask 。尝试与他人结伴编程、编写你自己的代码。
这是一些对你有帮助的资源:
Smallest Common Multiple
思路
- 为毛练习题都是在不停的算算术....我数学这么差
- 弄不明白公倍数到底是什么鬼,点开 Smallest Common Multiple 有点感觉了,但也没说到底要怎么算,难不成我也穷举一下?
- 自己拿笔画了画,感觉应该有公式能算出来
- 于是上百度大法,百度百科里果然给出了公式算法:
- 所以思路就是先取得数组的最小值和最大值;
- 取得最小值与 min.arr+1 的最小公倍数存入temp,然后取得temp与min.arr+i 的最小公倍数等等一直循环下去;
- 最后取得temp 与max.arr的最小公倍数即是整个数组的最小公倍数;
- 但是问题又出现了,要怎么取得两个数的最大公约数呢?
-
继续百度大法,得知居然有这个东西;gcd(共产党....?)、lcm;继续百度,得知有gcd 代表这个:欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数
image.png - 多读书还是有用的,先尝试解题;
解答
function smallestCommons(arr) {
var temp = [];
var min = Math.min.apply(this,arr);
var max = Math.max.apply(this,arr);
for(var i = min; i <= max; i++) {
temp.push(i);
}
var gcd = function(a,b) { //定义最大公约数取得方式;
if(b>0){
return gcd(b, a % b) ;
}
return a;
};
return temp.reduce(function(preValue,curValue) {
return preValue*curValue/gcd(preValue,curValue); //对temp数组进行迭代,取得最终的2个值的最小公倍数
});
}
smallestCommons([1,5]);
- 在摸索gcd的时候花了很长时间,一开始以为gcd 本身就是个函数,可以直接用,but不行,所以先定义了一下;
- 在最后的时候,本来想用for来比对temp的所有的最大公倍数,但想到如果这个数值很大,会不会导致超时;查了很多资料,发现之前有学过的reduce()可以实现数组迭代;看来还是学的不牢,继续加油!
网友评论