2014-02-24 55 views
-1

我想打印出FizzBu​​zz,當我可以被3和5整除時。我的代碼有什麼問題?Javascript中的邏輯運算符

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

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

因爲匹配的第一個條件將會執行,而沒有別的。 –

回答

3

如果第一或第二條件爲真,則進入該塊,但不評估任何其他else if條件。因爲第三個條件要求第一個和第二個都是真實的,所以它不可能進入該區塊。

嘗試安排你的情況是這樣的:

for(var i = 1; i<=20; i++){ 
    if(i%3 === 0 && i%5 === 0){ 
     console.log("FizzBuzz"); 
    }else if(i % 3 === 0){ 
     console.log("Fizz"); 
    }else if(i % 5 === 0){ 
     console.log("Buzz"); 
    }else{ 
     console.log(i); 
    } 
} 

但只是爲了好玩,這裏是一個更緊湊的版本,濫用conditional operator

for(var i = 1; i<=20; i++){ 
    console.log(i % 15 ? i % 5 ? i % 3 ? i : "Fizz" : "Buzz" : "FizzBuzz"); 
} 
+0

*使用條件運算符:console.log((i%3?「」:「Fizz」)+(i%5?「」:「Buzz」)的更緊湊(且高效)的解決方案。 i)' – Bergi

1

的主要問題是,你的支票「 FizzBu​​zz「直到你的其他比較之後纔會發生。如果i % 3 === 0(打印「FizzBu​​zz」的要求之一),它將永遠不會達到的FizzBu​​zz檢查。

作爲一個簡單的修復,移動你的FizzBu​​zz檢查到第一個if語句。

for(var i = 1; i <= 20; i++) { 
    if(i % 3 === 0 && i % 5 === 0) { 
     console.log("FizzBuzz"); 
    } 
    else if(i % 5 === 0) { 
     console.log("Buzz"); 
    } 
    else if(i % 3 === 0) { 
     console.log("FizzBuzz"); 
    } 
    else { 
     console.log(i); 
    } 
} 

至於另一件事想,如果我是分割雙方3和5,那麼它是通過他們的最小公分母整除,是嗎?最小公分母(最小整數這是由一組數字整除)的3和5是15,所以你可以替換...

if(i % 3 === 0 && i % 5 === 0) { 

...與...

if(i % 15 === 0) { 
+0

*那麼它可以被15 *整除=>確定,但是15是最大公約數?在這種情況下,這是因爲3和5都是素數,但是對於非優先級,它不一定以這種方式工作。 – Jon

+0

@Jon你的意思是最不常見的分母嗎?是的;它恰好是3 * 5,因爲它們都是素數。 –

+0

是的,mindblock,對不起。 LCD是正確的,而不是GCD。只是說一些解釋爲什麼這是相當的會有所幫助。 – Jon

0

(i%3 ==0 && i%5 ==0)應該是第一個條件。如果你仔細想想,如果我可以被3和5整除,它會在第三個輸入之前輸入第一個if