FizzBuzz の判定部分
上から書くと、重なった数が下の条件に届かない
3 の倍数なら Fizz、5 の倍数なら Buzz、両方なら FizzBuzz。ルールは 3 行で言い切れます。急所は、両方に当てはまる数が存在する ことです。
条件が重なっているとき何が起きるかを、別の数字で確かめます。2 の倍数なら Tick、7 の倍数なら Tock、両方なら TickTock というルールを、思いついた順に書いた場合です。
Java
if (n % 2 == 0) {
return "Tick";
} else if (n % 2 == 0 && n % 7 == 0) {
return "TickTock";
}14 を渡すと "Tick" が返ります。14 は 2 でも 7 でも割り切れるのに、最初の枝で確定してしまい、下の枝には永久に届きません。"TickTock" が返る日は来ないので、この行は書いた意味がなくなっています。
else if の連鎖は、上から順に見ていって最初に当たった枝だけを実行します。範囲が重なるときは、当てはまる数が少ないほうを先に 置きます。この例なら、2 つの枝を入れ替えるだけで直ります。
「両方」は == 0 を 2 回書く
&& の左右には boolean が必要です。余りをそのまま置くことはできません。
Java
if (n % 2 && n % 7) { // int を真偽値としては扱えない「2 で割った余りが 0」まで書き切って、はじめて true か false かを聞く 1 つの問いになります。== 0 は 2 つとも必要です。
ちなみに n % 2 == 0 && n % 7 == 0 は n % 14 == 0 と書いても同じ結果です。2 と 7 に 1 以外の共通の約数が無いので、両方で割り切れることと、掛け合わせた数で割り切れることが一致します。
数をそのまま返せない
このメソッドの戻り値は String です。どのルールにも当てはまらない数は、数字のままではなく文字列にして返す必要があります。
Java
String s = String.valueOf(42); // "42"return n; と書くと int cannot be converted to String で止まります。String.valueOf(n) を通してください。
4 つの枝を
ifだけで並べても動きます。ただしelse ifでつなぐと「ここまでの条件はどれも外れた」という情報が読み手に伝わるので、後から読む人の負担が減ります。
やってみよう
fizzbuzz(int n) を完成させてください。今回は数を 1 つ渡されたときの答えを返すところまでです。
- 4 つの答えを、当てはまる数が少ない順に並べ替える
- 「3 でも 5 でも割り切れる」を
&&で書き、いちばん上に置く - 残りの 2 つを
else ifで続け、最後のelseで数を文字列にして返す - 実行して
1591071の 5 件を通す
通ったら 30 や 45 のような 15 の倍数も呼んでみてください。ここが "Fizz" になっていたら、並べ替えがまだ効いていません。上の 14 の例とまったく同じことが起きています。
要件
- クラス名は
Solution、メソッド名はfizzbuzz、引数はint n1 つ、戻り値の型はString - 判定は
FizzBuzz→Fizz→Buzz→ それ以外、の順で行うこと (FizzBuzzを最初に判定しないと15のときにFizzが返ってしまう) - どれにも当てはまらないときは
String.valueOf(n)のようにnを文字列に変換して返すこと
入出力例
fizzbuzz(15) → "FizzBuzz"
fizzbuzz(9) → "Fizz"
fizzbuzz(10) → "Buzz"
fizzbuzz(7) → "7"
fizzbuzz(1) → "1"
fizzbuzz(30) → "FizzBuzz"