Smallest Common Multiple
找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。 范围是两个数字构成的数组,两个数字不一定按数字顺序排序。 例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。
注意:
这里涉及到经典算法:求最大公约数gcd(greatest common divisor)和最小公倍数scm(smallest common multiple)
gcd(最大公约数)算法过程(欧几里德算法/辗转相除法)
有两整数a和b:
① a%b得余数c,即c=a%b
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
scm算法(最小公倍数算法)
最小公倍数=两整数的乘积÷最大公约数,即scm=sqrt(a*b)/gcd(a,b)
//求val1和val2的最大公约数(greatest common divisor) //欧几里德算法(辗转相除法) function gcd(val1,val2){ if(val1%val2===0) return val2; else return gcd(val2,val1%val2); } function smallestCommons(arr) { //将arr按升序排序 arr=arr.sort(function(a,b){ return a-b; }); //求a和b的最小公倍数scm(smallest common multiple) //scm=abs(a*b)/gcd(a,b) var val=arr[0]; //这里求多个数的最小公倍数:先求出两个数的scm1,再求scm1与第三个数的scm2……依次循环 for(var i=arr[0]+1;i<=arr[1];i++){ val *=i/gcd(val,i); } return val; } smallestCommons([1,5]);