首页 > 解决方案 > while循环测试用例错误

问题描述

根据实践课程的问题是:

编写一个 JavaScript 程序来找到最大整数 n 使得 (1 + 2 + ... + n <= given integer ) 为真。例如。如果给定整数为 10,则最大整数 n 的值为 4,因此 1+2+3+4 <= 10 为真。您的输出代码应采用格式 console.log("Value of n is ", variableName)

我的代码是:

var num = prompt("Enter a number");

function test(x) {
  var sum = 1,
    n = 1,
    a = 0;
  while (sum <= x) {
    sum += n;
    n = n + 1;
    a += 1;

  }
  return a;
}
var output = test(num);
console.log("Result is :", output);

根据我输入的测试用例(10-4,15-5,16-6,17-6),我得到了正确的输出,但网站说程序有问题。

我究竟做错了什么?

标签: javascriptwhile-loop

解决方案


比循环更好的答案:利用数学。从三角数公式开始:

1 + 2 + ... + n = n * (n + 1) / 2

因此,对于 input x,您需要找到n这样的

n * (n + 1) / 2 <= x

为了解决这个问题,我们需要清理不等式,然后使用二次方程公式

n^2 + n <= 2x
n^2 + n - 2x <= 0

n <= (-1 + sqrt(1 + 8x)) / 2

作为最终解决方案。例如对于

x = 10: n <= (-1 + sqrt(81)) / 2; n <= 4
x = 16: n <= (-1 + sqrt(128)) / 2; n <= 5.156854249492381

将上限向下舍入,您就有了允许的最大整数。翻译成 JavaScript:

function test(x) {
  return Math.floor((Math.sqrt(8 * x + 1) - 1) / 2);
}

var num = prompt("Enter a number");
console.log("Result is :", test(num));


推荐阅读