0

这是我的代码

for(var i = 1; i <= 20; i = i + 1)

if(i%3==0)  {
    console.log("Fizz");
}else if (i%5==0){
    console.log("Buzz");
} 
else {
    console.log(i);
}

答案是

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz
16
17
Fizz
19
Buzz

但是看看那个“15”……它说的是“Fizz”,但它应该是“FizzBu​​zz”,因为它可以被 3 和 5 整除。哎呀! 我如何为这种情况添加特殊条件

4

5 回答 5

5

当你这样做时if else if,你不会通过else if第一个条件得到验证。

这是您问题的可能解决方案(有很多,没有一个非常优雅):

var special = false;
if (i%3==0) {
    console.log("Fizz");
    special = true
}
if (i%5==0){
    console.log("Buzz");
    special = true;
} 
if (!special) {
    console.log(i);
}

这是另一个:

var tolog = '';
if (i%3==0) {
    tolog += "Fizz";
}
if (i%5==0){
    tolog += "Buzz";
} 
console.log(tolog || i);

示范

于 2012-10-27T11:45:09.490 回答
3

你不应该写 else if

for(var i = 1; i <= 20; i = i + 1)

    if(i%3==0)  {
        console.log("Fizz");
    }
    if (i%5==0){
        console.log("Buzz");
    } 
    if (i%5 && i%3) {
        console.log(i);
    }
}
于 2012-10-27T11:45:31.627 回答
2

如果使用if-else,则只执行其中一个分支。你需要有一个不同的结构。

for (var i ... ) {
  if (i % 3 !== 0 && i % 5 !== 0) {
    console.log(i);
  } else {
    if (i % 3 === 0) { console.log('Fizz'); }
    if (i % 5 === 0) { console.log('Buzz'); }
  }
}
于 2012-10-27T11:46:32.810 回答
1

与其立即采取行动,不如花一些时间进一步考虑您的意见。如果你小心的话,你可以避免像一对 mods (%3 & %5) 这样的重复操作。

var result;
for(var i = 1; i <= 20; i = i + 1)
{
    result = '';

    if(i%3==0)
        result += 'Fizz';

    if(i%5==0)
        result += 'Buzz';

    // if neither of the two preceding statements assigned a value to result
    // then it's not divisible by either - just print the number.
    if (result.length == 0)
        result = i;

    console.log(result);
}
于 2012-10-27T11:53:33.747 回答
1

我会像这样对if结构进行分组

var i = 0;
while( ++i < 21 ){
    if ( i % 3 === 0 ) {
        if ( i % 5 === 0 ) console.log('FizzBuzz'); // Special case
        else console.log('Fizz');
    }
    else if ( i % 5 === 0 ) {
        console.log('Buzz');
    }
    else console.log(i);
}

jsPerf这里给出的一些答案。

于 2012-10-27T11:53:46.213 回答