我刚刚完成了FreecodeCamp.com测验Intermediate Algorithm Scripting: Smallest Common Multiple。
代码对于它们给出的测试用例([1, 5]
,[5, 1]
[23, 18]
和[1, 13]
)来说是可以正常工作的,但是如果我使用更大的范围,我还必须进行编辑代码并增加for
循环的停止条件,当我从循环中删除停止条件时,它会显示错误。
function smallestCommons(arr) {
arr.sort((a, b) => a - b);
const creatArray = (start, stop, step) =>
Array.from(
{ length: (stop - start) / step + 1 },
(_, i) => start + i * step
);
let myArray = creatArray(arr[0], arr[arr.length - 1], 1);
for (let i = myArray[myArray.length - 1]; i < 10000000; i++) {
if (myArray.every((e) => calback(e, i))) {
return i;
}
}
}
let calback = (elem, e) => e % elem === 0;
console.log(smallestCommons([1, 5]));
此代码是否有任何简单的解决方法?我的解决方案有效吗?或者有更好的方法来解决问题?
谢谢
答案 0 :(得分:0)
将解释一些代码;我们首先要做的是对数组进行排序,因为它是两个数字的数组,对它进行排序之后,我们需要创建一个新的数组来存储从第一个元素到第二个元素的路径;在存储路径之后,我们定义最大数与最小数之间的差,以便创建for来存储路径。我们定义了两个函数来查找总公除数和最小公倍数;之后,我们使用reduce来获得LCM的价值。希望对您有所帮助,gcd的算法基于Euclidean Division
function smallestCommons(arr) {
arr = arr.sort((a,b)=>a-b)
let newarr = []
let dif = arr[1]-arr[0]
for(let i=0; i<= dif;i++){
newarr.push(arr[0]+i)
}
const gcd = (a,b)=>a?gcd(b%a,a):b;
const lcm = (a,b)=> a/gcd(a,b)*b
return newarr.reduce(lcm);
}
console.log(smallestCommons([1, 5]));
console.log(smallestCommons([90,10]));