javascript - 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),我得到了正确的输出,但网站说程序有问题。
我究竟做错了什么?
解决方案
比循环更好的答案:利用数学。从三角数公式开始:
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));
推荐阅读
- c# - Windows 比例正在影响我的应用程序字体
- c# - SearchHandler xamarin IOS
- xpath - 拆分 XPATH 会产生比实际结果更多的结果
- reactjs - 使用 Moment 时 DatePicker 上的 React Moment 问题(可能是依赖关系)
- android - SourceCodeScanner 没有调用 visitMethodCall
- node.js - MongoDB - $filter 中的聚合 $filter / 过滤子文档中的子文档数组
- asp.net-core - Asp.net 核心日志记录到文件在 inetpub\wwwroot\project 文件夹内的 iis 服务器上不起作用
- scala - Spark scala - 有条件地从其他列添加一个 json 列
- ios - 如何将来自 TextField 的输入存储到 Swift 中的字符串数组中?
- html - 带有事件的 jquery.submit 函数