<html><head></head>
<body><script>
function GCD(a, b) {
if (a == 0) {
return b;
}
return GCD(b % a, a);
}
function difference(array) {
for (var i = Math.min(...array) + 1; i < Math.max(...array); i++) {
array.push(i);
}
array.sort((a, b) => a - b);
}
function smallestCommons(arr) {
difference(arr);
console.log(arr);
a = arr[arr.length - 1];
b = arr[arr.length - 2];
var LCM = a * b / GCD(a, b);
while (true) {
var index = arr.findIndex(element => LCM % element !== 0);
if (index === -1) {
return LCM;
}
LCM *= arr[index];
console.log(LCM);
}
}
smallestCommons([1, 5]) // right
smallestCommons([2, 10]) // right
smallestCommons([1, 13]) // wrong
smallestCommons([23, 18]) // wrong
</script></body>
</html>
这是此挑战的代码:
https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/smallest-common-multiple/
我使用的算法:
1-计算两个最大数字的LCM。
2-在所有数组上尝试LCM%number,如果找到不返回0的数字,则将其分配给var索引并乘以* LCM,然后继续这样做,直到找不到任何东西并返回-1相反,发生这种情况时,请最终退还LCM。
该代码在前两个数组中起作用,但在后两个数组中却不起作用,这引起了我的思考,我的算法是否错误,我只是在浪费时间尝试进行调整,还是对了,只需要进行一些调整即可?
请注意,这里有3个不同的函数,第一个函数计算GCD以便稍后计算LCM,然后第二个函数将值推入数组中两个值之间,然后对其进行排序,第三个函数计算LCM(最低公倍数)
问题是最后第二个数组:
minimumCommons([1,13])返回4324320而不是360360
minimumCommons([23,18])返回72681840而不是6056820
所以我想知道的是,请专注于此:
我的整个方法(算法)是否错误,我需要重写一个整体还是需要一些调整才能工作?
请不要给我准备好的代码。只需告诉我我想知道的内容,并谢谢您(:
最佳答案
你乘arr[index]
是错误的。
为了清楚起见,让我们重新标记变量:
N =数组[索引]
p = GCD(LCM,N)
现在我们可以将N和LCD重写为:
N = p×q
LCM = p×r
要使最小数为当前LCM和N的最小公倍数,您需要将其计算为:
液晶模组:= p×q×r
但是如果用代码计算
LCM *= arr[index];
你实际上算
LCM:=(p×r)×(p×q)= p×p×q×r
即1 p因子太大。要根据需要计算它,您应该使用以下代码:
LCM *= arr[index] / GCD(LCM, arr[index]);
关于javascript - 我的算法是错误的还是正确的,仅需要调整?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51176122/