我正在编写这段代码,您可以在其中输入一个数字和一个可被该数字整除的数字以及该数字之前的所有数字(1,2, ...n 的最小公倍数)。我以为我已经拥有了它,直到我注意到一些奇怪的事情。当您输入 16 时,您会得到 720720。这是正确的(720720 可以被 16 以内的所有数字整除)。但是,当您输入 17 时,输出是 6126120。这是错误的。我发现16之前的数字都是关闭的。为什么会这样呢?我所知道的是 6126120 是应该输出的一半。
<!DOCTYPE html>
<html>
<body>
<h1>The + Operator</h1>
<p id="demo"></p>
<input type="number" id="myNumber" value="2">
<button onclick="myFunction()">Get your Answer!</button>
<script>
function myFunction() {
var number = document.getElementById("myNumber").value;
var lowEnd = 1;
var highEnd = number;
var arr = [];
while (lowEnd <= highEnd) {
arr.push(lowEnd++);
}
function lcm_more_than_two_numbers(input_array) {
if (toString.call(input_array) !== "[object Array]")
return false;
var r1 = 0, r2 = 0;
var l = input_array.length;
for (i = 0; i < l; i++) {
r1 = input_array[i] % input_array[i + 1];
if (r1 === 0) {
input_array[i + 1] = (input_array[i] * input_array[i + 1]) / input_array[i + 1];
}
else {
r2 = input_array[i + 1] % r1;
if (r2 === 0) {
input_array[i + 1] = (input_array[i] * input_array[i + 1]) / r1;
}
else {
input_array[i + 1] = (input_array[i] * input_array[i + 1]) / r2;
}
}
}
return input_array[l - 1];
}
document.getElementById("demo").innerHTML = lcm_more_than_two_numbers(arr);
}
</script>
</body>
</html>
提前致谢!
最佳答案
哇,这是一个很难跟踪的错误,多么奇怪的算法!
在第二个 else 中,您不应该除以 r2 :
input_array[i + 1] = (input_array[i] * input_array[i + 1]) / r2;
应该是
input_array[i + 1] = input_array[i] * input_array[i + 1];
我发现通过在每个循环中显示 r1
、r2
和 input_array[i+1]
并注意到只有 >r2 > 1
是错误的(顺便说一下,你错过了 lcm(1..7)
,它是 140,应该是 420)。然后我注意到预期的结果是获得的结果乘以r2
。
编辑:不,至少在 27 和 28 时间内仍然损坏。只是一个很好地伪装 LCM 的算法。
关于javascript - 使用数组的数学跳过 "16",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33945685/