Smallest Common Multiple FreeCodeCamp
题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。 范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
分析:首先题目的意思求一个连续数列的所有数字的最小公倍数,这连续的数字序列可能递增,也可能递减,有两种情况,为了使代码简洁,
我们将其变为一种情况,也就是递增数列,这样避免重复写递减数列的情况。再一看,这里说了参数是数组,那么可以使用sort()方法排序。
这道题其实只要懂得怎么求两个数之间的最小公倍数,就可以求这个序列的最小公倍数了。因为,最小公倍数也是一个数字,
而且无论多长的数列最终都可以化成是求两个数字之间的最小公倍数。比如说你要求的数列1,2,3的最小公倍数是6,1和2的最小公倍数是2,
求最小公倍数 2 和3的最小公倍数也是6.以此类推即可。
那么最小公倍数怎么求呢,查看百度百科 最小公倍数 的计算方法
https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0/6192375?fr=aladdin
如图,可知,最小公倍数等于它们的 最大公约数 和 它们各自与最大公约数的 商 的乘积。
那么最大公约数这么求呢,查看百度百科最大公约数的求法,
https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%BA%A6%E6%95%B0/869308?fr=aladdin
可知,我们可以使用辗转相除法也就是欧几里德算法
js使用递归实现为:
function gcd(m,n){
if(m%n===0)return n;
return gcd(n,m%n);
}
至此,思路已经基本清晰。完整实现代码为:
function gcd(m, n){
if(m%n === 0) return n;
return gcd(n, m%n);
}
function smallestCommons(arr) {
arr = arr.sort();
var num = arr[0];
for(var i= arr[0]+1; i<=arr[1]; i++){
num *= i/gcd(num, i);
}
return num;
}