簡體   English   中英

while循環測試用例錯誤

[英]while loop test case errors

根據實踐課程的問題是:

編寫一個JavaScript程序以找到最大整數n,使(1 + 2 + ... + n <=給定整數)為true。 例如。 如果給定的整數為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),但是網站上說程序有問題。

我究竟做錯了什么?

比循環更好的答案:利用數學。 三角數公式開始

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

考慮傳遞的值是否為11。然后,最大整數n應該為4,因為1+2+3+4 < 11為真,而1+2+3+4+5 < 11為假。 您的當前代碼在輸入11時輸出5,但這是不正確的; 你的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); 

我認為這將為您工作:

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

下面的代碼應該為您工作。 基本上,我所做的是,如果輸入為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減1以獲取您的值:

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

嘗試以下功能找到最大數量

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加倍以保留先前的循環值,如果不滿足條件則意味着當前循環值無用,因此返回先前循環的保留值

輸出測試

在此處輸入圖片說明

下面將幫助您完成工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM