定番 FizzBuzz判定

条件を並べる順番のドリル

FizzBuzz は、条件分岐の練習として世界中で使われている定番の題材です。ルールは次のとおりです。3の倍数なら Fizz、5の倍数なら Buzz、3と5の両方の倍数なら FizzBuzz、どれでもなければ数をそのまま表示します。

1から100まで並べる版が有名ですが、繰り返しはまだ習っていないので、今回は数をひとつ受け取って1回だけ判定します。繰り返しと組み合わせる版は第4章で作ります。今回学ぶのは、条件を並べる順番という一点です。

倍数の判定は剰余で

「3の倍数」は、3で割った余りが0ということです。第2章で使った剰余演算子 % がそのまま使えます。

if (n % 3 == 0) { printf("Fizz\n"); }

%== より先に計算されるので、(n % 3) == 0 と同じ意味になります。かっこを付けても構いません。

素直に書くと FizzBuzz が出ない

多くの人が最初にこう書きます。

if (n % 3 == 0) { printf("Fizz\n"); } else if (n % 5 == 0) { printf("Buzz\n"); } else if (n % 3 == 0 && n % 5 == 0) { printf("FizzBuzz\n"); } else { printf("%d\n", n); }

15 を入れてみると Fizz と出ます。15 は3の倍数なので1つ目の条件で確定し、else if の性質どおり残りは評価されないからです。3つ目の条件はどんな数を入れても真になりません。到達できない枝は、書いた本人以外にはバグに見えないので厄介です。

厳しい条件を先に置く

直し方は前回と同じ考え方です。当てはまる数が最も少ない、つまり最も厳しい条件を先頭に置きます。

if (n % 3 == 0 && n % 5 == 0) { printf("FizzBuzz\n"); } else if (n % 3 == 0) { printf("Fizz\n"); } else if (n % 5 == 0) { printf("Buzz\n"); } else { printf("%d\n", n); }

3と5の両方の倍数は3の倍数でもあるので、両方の判定を先に済ませておく必要があります。なお n % 3 == 0 && n % 5 == 0n % 15 == 0 と書いても同じ結果です。3と5に共通の倍数は15の倍数だからです。意図が伝わるのは前者、短いのは後者で、どちらを選んでも構いません。

要件

  1. scanf で整数を1つ読む
  2. 3と5の両方の倍数なら FizzBuzz と表示する
  3. 3の倍数だけなら Fizz、5の倍数だけなら Buzz と表示する
  4. どれでもなければ読み込んだ数をそのまま表示する
  5. 表示するのは1行だけにする

入出力例

main("9")"Fizz" main("10")"Buzz" main("30")"FizzBuzz" main("7")"7" main("1")"1"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

定番 FizzBuzz判定

⌘S で保存