1

我已经做过几次 FizzBu​​zz,但从来没有遇到过这个问题。也许,这是我不理解的 for 循环的基本原理。出于某种原因,下面的代码运行时间比它应该运行的时间长 10 倍(嗯,比我认为的应该)。如果用户输入 20,它将运行到 200。我通过设置 i = 0 解决了这个问题;i < num 然后将 i+1 打印到我的 div 中,但我仍然不明白为什么原始代码无法按预期工作。当我这样做时,我不妨承认我仍然无法正确设置 JSFiddle。http://jsfiddle.net/nngrey/hA4pg/(这根本不运行。)因此,对此的任何想法也将不胜感激。谢谢!

<head>
  <title>Fizz Buzz</title>
  <script>
    function fizzbuzz(){
      var num = prompt("Please enter a number between 1 and 100: ");
      for(var i=1; i<num+1; i++){
        if (i%3===0 && i%5===0){
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>Fizz Buzz</p>";
        }else if (i%3===0){
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>Fizz</p>";
        }else if (i%5===0){
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>Buzz</p>";
        }else{
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>"+i+"</p>";
        }
      }
    }
  </script>
</head>

<body onLoad = "fizzbuzz()">
  <div id = "div1">
    <h1>Fizz Buzz</h1>
  </div> 
</body>
4

4 回答 4

4

在您的代码中,prompt()返回一个字符串。Javascript 将评估这一行:

      for(var i=1; i<num+1; i++){

num作为字符串。即 num+1 变为“20”+“1”(注意引号),即“201”。然后对比较进行数值评估,因此您的循环运行时间比它应该运行的时间长十倍。

在您的修订版本i < num中以数字方式评估,因此循环运行正确的时间。

您可以强制num成为这样的数字:

      var num = Number(prompt("Please enter a number between 1 and 100: "));

num现在是一个数字,所以 20 + 1 = 21 (注意 - 没有引号)并且你的循环的两个版本都应该正确运行

于 2013-10-25T04:06:33.873 回答
0

你需要做:

var num = parseInt(prompt("Please enter a number between 1 and 100: "), 0);

prompt返回一个字符串,所以如果输入20,num+1是字符串"201",而不是数字21

于 2013-10-25T04:07:15.237 回答
0

prompt()返回一个字符串。

取而代之的是简单的使用+prompt()。那应该使它成为一个数字。更新了代码演示

于 2013-10-25T04:08:58.100 回答
0

num是一个字符串,您必须使用parseInt它来将其转换为 int

for(var i=1; i<parseInt(num)+1; i++){
}
于 2013-10-25T04:08:59.667 回答