初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので解説付きで自分で作ってみました。
言語はPython3です。
問題
Paizaのスキルチェック見本問題 Fizz Buzz (paizaランク C 相当)
https://paiza.jp/works/mondai/skillcheck_sample/fizz-buzz?language_uid=python3
paizaは登録が無料ですぐにできるので、とりあえず登録してみることをおススメします。
下記の問題をプログラミングしてみよう!
整数 N が入力として与えられます。
1からNまでの整数を1から順に表示してください。
ただし、表示しようとしている数値が、
・3の倍数かつ5の倍数のときには、"Fizz Buzz"
・3の倍数のときには、"Fizz"
・5の倍数のときには、"Buzz"
を数値の代わりに表示してください。
###入力される値
入力は以下のフォーマットで与えられます。
N
N は1以上N以下の整数です。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
###期待する出力
最後は改行し、余計な文字、空行を含んではいけません。
###条件
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ N ≦ 100
・N は整数
####入力例1
5
####出力例1
1
2
Fizz
4
Buzz
####入力例2
20
####出力例2
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
解説
###入力値を受け取る
入力値は0-100の整数値です。
input関数を用いて入力値を受け取った後、int関数を用いて、str型からint型に型変換しておきます。
n = int(input())
数値を順に表示する
次に、代わりに表示しなければいけない数値を探します。今回は、1からnまでの整数のを順番に探していけばよいので、range関数を用います。
この時注意しなければならないのが、range関数の範囲の指定の仕方です。
range関数で引数を二つ入力した場合は、第一引数はbegin start、第二引数はend stopとなります。
この時、end stop引数は、その数自身を含まず、一つ前の整数を出力するように指定します。
つまり、range(1, 5)
とした場合の出力は、1,2,3,4となり、5は含まれません。
1,2,3,4,5 と出力したい場合は、range(1, 5+1)
と指定する必要があります。
print(list(range(1,5))) # [1,2,3,4]
print(list(range(1,6))) # [1,2,3,4,5]
今回の場合、1からnまでの整数値が欲しいので、range関数には 1, n+1 と引数を渡します。
for文と組み合わせるとこのようになります。
n = int(input())
for i in range(1, n+1):
print(i)
"""
n = 5の時、
1
2
3
4
5
"""
FizzBuzzを見つける
次に、fizzBuzzに変換しなければならない数値を判定します。
そのために % (余りを求める代数演算子)を使用します。
もし、n を 3で割った余りがゼロであれば、nは 3の倍数です。
もし、n を 5で割った余りがゼロであれば、nは 5の倍数です。
もし、n を15で割った余りがゼロであれば、nは 3の倍数であり、かつ5の倍数です。
3の倍数であり、かつ5の倍数ということは、15の倍数であるということです。
今回はif-elif文を用いて判定します。
この時、判定する順番は注意が必要です。
n が3、または5の倍数であるかどうかの判定を、
15の倍数であるかどうかの判定よりも先に書いてしまうとうまくいきません。
nが3、または5の倍数であるかどうかの判定を、
15の倍数であるかどうかの判定よりも先に書く場合には少し工夫が要ります。
@shiracamus様が指摘された方法があり、下のコメント欄で確認してみてください。
今回は判定する順番により解決したいと思います。
# ダメなコード
n = 15
if n%3 == 0:
print("nは3の倍数です。")
elif n%5 == 0:
print("nは5の倍数です。")
elif n%15 == 0:
print("nは3の倍数かつ5の倍数です。")
else:
print("nは3の倍数でも5の倍数でもありません。")
# nは3の倍数です。
もしnが15の倍数であった場合、15の倍数ではなくて、3、または5の倍数と判定されてしまいます。
上から順番に処理されていくことを意識しておきましょう。
したがって、まず最初に、15の倍数であるかどうかを判定します。
その後に、5の倍数であるか、3の倍数であるかを判定するとうまくいきます。
n = 15
if n%15 == 0:
print("nは3の倍数かつ5の倍数です。")
elif n%5 == 0:
print("nは5の倍数です。")
elif n%3 == 0:
print("nは3の倍数です。")
else:
print("nは3の倍数でも5の倍数でもありません。")
# nは3の倍数かつ5の倍数です。
一般的に、if-elif文を書くときは狭い条件の方から先に書くとうまくいくことが多いようです。
解答コード
n = int(input())
for i in range(1, n+1):
if i%15==0:
print("Fizz Buzz")
elif i%5==0:
print("Buzz")
elif i%3==0:
print("Fizz")
else:
print(i)
参考
最後に
過去の自分が引っかかったところを詳しく説明したつもりです。
まわりくどくて分かりにくいところもあったかもしれませんが、
なにか気になる点があれば気軽にコメントしてくださいね。