FCC题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。
示例:
smallestCommons([1, 5])
应该返回一个数字。
smallestCommons([1, 5])
应该返回 60。smallestCommons([5, 1])
应该返回 60。smallestCommons([1, 13])
应该返回 360360。
步骤:
1.从小到大,获得最大最小值
2.所有连续数字值从大到小
3.获得最大公约数,辗转相除法:用小数除大数,如果余数不是零,就把余数和较小的数构成一组新数,继续上面的除法,知道大数被小数约尽,此时比较小的数就是最大公约数 80=36*2+8,36=8*4+4,8=4*2+0
4.两个数之间的最小公倍数为两个数之积除以最大公约数。
1 function smallestCommons(arr) {
2 //从小到大,获得最大最小值
3 arr=arr.sort(function(a,b){return a-b;});
4 var min=arr[0];var max=arr[1];
5 //所有连续数字值从大到小
6 var arrtemp=[];
7 for(var i=max;i>=min;i--){
8 arrtemp.push(i);
9 }
10 //获得最大公约数,辗转相除法:用小数除大数,如果余数不是零,就把余数和较小的数构成一组新数,继续上面的除法,知道大数被小数约尽,此时比较小的数就是最大公约数 80=36*2+8,36=8*4+4,8=4*2+0
11 function getCommons(a,b){
12 if(a%b===0) return b;
13 return getCommons(b,a%b);
14 }
15 //两个数之间的最小公倍数为两个数之积除以最大公约数。
16 return arrtemp.reduce(function(m,n){
17 return n*m/getCommons(m,n);
18 });
19 }
20
21 smallestCommons([8,2]);