根据实习课程,问题是:
编写一个JavaScript程序以求最大整数n,使(1 +2+.+n <=给定整数)为真。就像。如果给定的整数为10,则最大整数n的值为4,因此1+2+3+4 <= 10为真。输出代码应采用console.log格式(“值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),我得到了正确的输出,但是网站上说程序有问题。
我做错什么了?
发布于 2019-02-20 05:40:21
最好的答案比循环:利用数学。从三角数公式开始
1 + 2 + ... + n = n * (n + 1) / 2
因此,对于输入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));
发布于 2019-02-20 05:32:13
如果传递的值为11,则最大整数n
应为4,因为1+2+3+4 < 11
为真,而1+2+3+4+5 < 11
为false。但是,当前代码输出的输入为11,这是不正确的;您的while
循环有时超出了sum
。
您还需要初始化sum
以从0开始,而不是在1开始。
在返回之前,从a
中减去一个:
function test(x) {
var sum = 0,
n = 1,
a = 0;
while (sum <= x) {
sum += n;
n = n + 1;
a += 1;
console.log(a, sum);
}
return a - 1;
}
console.log(test(10));
console.log(test(11));
var num = prompt("Enter a number");
var output = test(num);
console.log("Result is :", output);
发布于 2019-02-20 05:39:08
我想这对你有用:
var num = prompt("Enter a number");
function test(x) {
var sum = 1,
n = 0;
while ((sum+n) <= x) {
n = n + 1;
sum += n;
}
return n;
}
var output = test(num);
console.log("Result is :", output);
https://stackoverflow.com/questions/54779358
复制相似问题