while循环测试用例错误

问题描述 投票:0回答:8

根据实践课程的问题是:

编写一个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),我得到了正确的输出,但网站上说程序有问题。

我究竟做错了什么?

javascript while-loop
8个回答
2
投票

比循环更好的答案:利用数学。从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));

1
投票

考虑传递的值是否为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);

0
投票

下面的代码应该适合你。基本上,我所做的是如果输入是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);

0
投票

您的操作顺序有点时髦;你所要做的就是添加增量器。 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;
}

0
投票

这是代码的简化版本,基本上我们在每次迭代中首先递增要添加的数字(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);

0
投票

我认为这对你有用:

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);

0
投票

尝试以下功能查找最大数量

function maxNumber(a){
 var i=1,sum=0,maxNumber=0;
 while(sum<=a) { 
     sum=sum+i; 
     if(sum<=a) 
      { 
        maxNumber=i;
      }
      i+=1;
   } 
   return maxNumber;
} 

加倍检查条件sum<=a以保留先前的循环值,如果条件不满足则表示当前循环值无效,因此返回保留前一循环的值

输出测试:

enter image description here


0
投票

以下将帮助您完成工作。

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));
© www.soinside.com 2019 - 2024. All rights reserved.