我一直在寻找有关SO的解释,但我只是在其他编程语言中找到了对我来说不太清楚的答案。
我怀疑它背后的数学是我没有得到的,因为代码很清楚,但如果有人不介意解释,我会感激不尽。
(我在那里添加了评论,试图向我自己解释发生了什么,所以如果他们错了,那也很好。)
已编辑添加:预期输入是两个数字的数组。任务是找到这两个值之间所有数字的最小公倍数。知道可能很重要。抱歉。
function smallestCommons(arr) {
var i = Math.min(arr[0], arr[1]);
var j = Math.max(arr[0], arr[1]);
var resultArr = [];
// make an array of the numbers from high to low
while (j >= i) {
resultArr.push(j);
j--;
}
return resultArr.reduce(function(x, y) {
var a = x,
b = y,
t = 0;
// while a is not evenly divisible by b
while (a % b) {
a = a % b; // a is the remainder
t = a; // t is the remainder
a = b; // a is now the divisor
b = t; // the divisor is now the remainder
}
return (x / b) * y;
});
}
答案 0 :(得分:1)
此评论并不正确。这一行创建了i和j之间的数字数组,从高到低排序。也就是说,如果你有array = [1,10],resultArr将是[10,9,8,7,6,5,4,3,2,1]。
真的,你所拥有的是第一个和第二个数字之间的差异。这是欧几里得算法中寻找GCD(最大公共分母)的第一步
第二部分是一步计算gcd以及计算素因子并得到它们的乘积。
答案 1 :(得分:0)
使用此代码
function leastCommonMultiple(min, max) {
function range(min, max) {
var arr = [];
for (var i = min; i <= max; i++) {
arr.push(i);
}
return arr;
}
function gcd(a, b) {
return !b ? a : gcd(b, a % b);
}
function lcm(a, b) {
return (a * b) / gcd(a, b);
}
var multiple = min;
range(min, max).forEach(function(n) {
multiple = lcm(multiple, n);
});
return multiple;
}
leastCommonMultiple(1, 13); // => 360360