根据实践课程的问题是:
编写一个JavaScript程序来查找最大整数n,使(1 + 2 + ... + n <=给定整数)为真。例如。如果给定的整数是10,则最大整数n的值是4,因此1 + 2 + 3 + 4 <= 10是真的。您的输出代码应采用console.log格式(“n的值为”,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),我得到了正确的输出,但网站上说程序有问题。
我究竟做错了什么?
比循环更好的答案:利用数学。从Triangular number formula开始:
1 + 2 + ... + n = n * (n + 1) / 2
因此,对于输入x
,你需要找到n
这样的
n * (n + 1) / 2 <= x
要解决这个问题,我们需要清理不等式,然后使用quadratic equation formula:
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));
考虑传递的值是否为11.然后,最大整数n
应为4,因为1+2+3+4 < 11
为true,而1+2+3+4+5 < 11
为false。但是,当前代码输出5表示输入为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);
下面的代码应该适合你。基本上,我所做的是如果输入是10,并且你的总和是9,它仍将进入while循环。然后它将再次添加n,现在您的数字大于您的输入(即10),但您仍然返回它。这里我所做的是,在while循环结束时,如果你的总和大于你的输入,则从a中减去1。这样它仍然会执行,但它会解决问题。
我注意到的另一个错误是总和从1开始,n从1开始。你想要1 + 2 + 3 + ... + n,但是使用你以前的方法,你得到1 + 1 + 2 + 3 + .. 。+ N。
var num = prompt("Enter a number");
function test(x) {
var sum = 0,
n = 1,
tempSum = 1,
a = 0;
while (sum <= x) {
sum += n;
n++;
a++;
if (sum > x) {
a--;
}
}
return a;
}
var output = test(num);
console.log("Result is :", output);
您的操作顺序有点时髦;你所要做的就是添加增量器。 while
虚假案件将确保总和仅超过该数字一次。所以当你返回时,将数字减少一个:
var num = prompt("Enter a number");
var output = test(num);
console.log("Result is :", output);
function test(num){
let sum = 0
let inc = 0
while(sum<=num)
sum+=++inc
return --inc;
}
这是代码的简化版本,基本上我们在每次迭代中首先递增要添加的数字(n
),然后我们将它添加到持有sum
的变量中。当循环条件评估为false
时,您需要将一个减少到n
以获得您的值:
var num = prompt("Enter a number");
function test(x)
{
var sum = 0, n = 0;
while (sum <= x)
{
sum += (++n);
}
return --n;
}
var output = test(num);
console.log("Result is :", output);
我认为这对你有用:
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);
以下将帮助您完成工作。
var num = prompt("Enter a number");
function findMaxNumber(num){
var sum = 0;
var counter = 0;
while(sum < num){
if(sum + counter > num){
break; // Exit loop
}
sum = sum + counter;
counter++;
}
return --counter; // Loop will cause this to be 1 higher than the max int.
}
console.log('Result is: ' + findMaxNumber(num));