while循环测试用例错误

时间:2019-02-20 05:25:16

标签: javascript while-loop

根据实践课程的问题是:

  

编写一个JavaScript程序以找到最大整数n,以使(1 + 2 + ... + n <=给定整数)为true。例如。如果给定的整数为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),但是网站上说程序有问题。

我在做什么错了?

8 个答案:

答案 0 :(得分: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 :(得分:1)

请考虑传递的值是否为11。然后,最大整数- name: example copying file with owner and permissions copy: src: myscript.ps1 dest: myscript.ps1 - name: Run ps1 script in privileged mode hosts: "{{ my_hosts }}" become_method: runas vars: ansible_become_password: passwordhere tasks: - win_shell: '.\myscript.ps1' become: yes become_user: Administrator - name: Create new user win_user: name: someuser password: somepassword state: present groups: - Users 应该为4,因为n为true,而1+2+3+4 < 11为false。您的当前代码在输入11时输出5,但这是不正确的;您的1+2+3+4+5 < 11循环有时会超出while

您还需要初始化sum,使其开始于0,而不是1。

sum中减去一个,然后返回:

a

答案 2 :(得分: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);

答案 3 :(得分: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);

答案 4 :(得分: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;
}

答案 5 :(得分: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);

答案 6 :(得分: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

答案 7 :(得分: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));