[英]Math using array skips “16”
我正在编写此代码,在其中键入一个数字以及一个可被其整除的数字以及它之前的所有数字(最小公倍数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>
提前致谢!
哇,那是一个很难跟踪的错误,真是个奇怪的算法!
在第二秒中,您不应该除以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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.