跳到內容

06|FizzBuzz

還沒完成C 或 C++ 皆可CPU 時間上限 1 秒

相關主題: C 基礎速查

C 或 C++ 皆可|CPU 時間上限 1 秒

從 1 數到 n,每個數字輸出一行,但是:

  • 如果是 3 的倍數,而且也是 5 的倍數,輸出 FizzBuzz
  • 如果只是 3 的倍數,輸出 Fizz
  • 如果只是 5 的倍數,輸出 Buzz
  • 其他情況,輸出數字本身

一行,一個整數 n(1 ≤ n ≤ 100,000)。

輸出 n 行,第 i 行是依照上面的規則對數字 i 的輸出(i 從 1 到 n)。Fizz、Buzz、FizzBuzz 的大小寫要和題目一樣。

輸入:

15

輸出:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
  • for 迴圈:for (int i = 1; i <= n; i++),注意起點是 1、終點要包含 n
  • % 判斷倍數:i % 3 == 0 表示 i 是 3 的倍數
  • if / else if / else:只會執行第一個成立的條件,所以順序很重要
  • C++:大量輸出時用 "\n" 換行,不要用 std::endl。std::endl 除了換行,還會強制把緩衝區的內容寫出去(flush),每一行都這樣做會很慢
提示 1:為什麼 15 印成了 Fizz?

15 是 3 的倍數,也是 5 的倍數。如果你的程式先判斷 i % 3 == 0,條件成立後就印 Fizz,後面的 else if 都不會執行了。

把「同時是 3 和 5 的倍數」這個最嚴格的條件放在最前面。

提示 2:「同時是 3 和 5 的倍數」怎麼寫?

可以寫成 i % 3 == 0 && i % 5 == 0。因為 3 和 5 沒有共同的因數,這等於「是 15 的倍數」,所以也可以寫成 i % 15 == 0。

提示 3:C++ 輸出 10 萬行有點慢?
  1. 換行用 "\n" 或 '\n',不要用 std::endl
  2. 在 main 的開頭加上這兩行,可以讓 cin、cout 快很多:
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);

加了之後,就不要在同一個程式裡混用 printf / scanf 和 cout / cin。