Dan*_*mel 0 javascript algorithm lcm
我正在使用JavaScript,我正在解决最小的公共倍数,两个数字,并且最小的公共倍数必须可以被两个数字之间的所有数字整除.
现在,我的代码根本不工作,没有返回任何内容.我有一个函数来计算最小公倍数和第二个函数来确定该倍数是否可被最小和最大数字之间的数字整除.
function smallestCommons(arr) {
var max = 0;
var min = 0;
var lcm = 0;
var max2 = 0;
if(arr[0]> arr[1]) {
max = arr[0];
min = arr[1];
} else {
max = arr[1];
min = arr[0];
}
function range(item){
for(var j = min+1; j < max; j++){
if(item % j !== 0){
return 0;
} else {
return item;
}
}
}
function lcmFind(min1, max1){
for(var i =1; i < min1; i++){
max1 = max1 * i;
if(range(max1) === 0){
continue;
} else {
return range(max1);
}
}
}
return lcmFind(min,max);
}
smallestCommons([1,5]);
Run Code Online (Sandbox Code Playgroud)
您正在寻找lcm或最小公倍数.碰巧的是lcm(a, b) = a * b / gcd(a, b),gcd是最大公约数,两个数都是最大公数的最大数.有一种叫做欧几里德算法的算法可以快速计算gcd:gcd(a, b) = gcd(b, a % b)其中a%b是a modulo b.在javascript中,就是这样.
function gcd(a, b) {
if (b == 0) {
return a; // so that the recursion does not go on forever
} else {
return gcd(b, a % b);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样定义lcm.
function lcm(a, b) {
return a * b / gcd(a, b);
}
Run Code Online (Sandbox Code Playgroud)
编辑:为了计算数字列表的lcm,只需用lcm函数减少.因此,为了计算范围内所有数字的lcm,此代码将起作用.(假设范围包含2个参数)
function lcmOfRange(a, b) {
var range = [];
for (var i = a; i <= b; i++) {
range.push(i);
}
return lcmOfList(range);
}
function lcmOfList(arr) {
return arr.reduce(lcm);
}
Run Code Online (Sandbox Code Playgroud)
这相当于
function lcmOfRange(a, b) {
var result = a;
for (var i = a + 1, i <= b; i++) {
result = lcm(result, i);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)