#FizzBuzzを出力するときに気をつけるべきこと#
##FizzBuzz問題とは##
最初のプレイヤーは「1」、次のプレイヤーは前のプレイヤーの次の数字を言うゲーム
ただし・・・
- 3で割り切れる場合は「Fizz」
- 5で割り切れる場合は「Buzz」
- 両方(すなわち15)で割り切れる場合は「Fizz Buzz」
というルールがあります
FizzBuzz問題は比較的かんたんなプログラムで出力できることから、
初心者プログラマが乗り越えるべき壁となっています
##ひな型になるfor文を書きます##
for(int i = 1;i < 100;i++){
System.out.println(i);
}
##上記の意味は?##
- 整数型(Integer)を宣言
- 添字「i」を1として初期化
- iを99(100含まず)までインクリメント(増分)し、
- インクリメントされた添字iを改行付きで出力する
1
2
3
(中略)
97
98
99
99まで出力されました
##上のコードに手を加える##
文字列「はFizzです」を連結する
for(int i = 1;i < 100;i++){
System.out.println(i + "はFizzです");
}
###結果・・・###
1はFizzです
2はFizzです
3はFizzです
4はFizzです
5はFizzです
(中略)
15はFizzです
(中略)
96はFizzです
97はFizzです
98はFizzです
99はFizzです
1も3も15もFizzとなってしまいました
これは「3の倍数なら」「5の倍数なら」「3かつ5の倍数なら」「そうでないなら」という条件分岐をしていないからです
##3の倍数に「Fizz」と出力する##
3の倍数なら「Fizz」、そうでなければ数字を出力するように書き加えます
for(int i = 1;i < 100;i++){
if(i % 3 == 0){
System.out.println(i + "はFizzです");
}
else{
System.out.println(i);
}
}
「i % 3 == 0」は
iを3で割った余りが0
すなわち3の倍数であることを意味します
###結果###
1
2
3はFizzです
4
5
6はFizzです
7
8
9はFizzです
10
(中略)
15はFizzです
16
17
18はFizzです
(中略)
93はFizzです
94
95
96はFizzです
97
98
99はFizzです
##3の倍数、「Fizz」と5の倍数に「Buzz」と出力する##
3の倍数なら「Fizz」5の倍数なら「Buzz」、そうでなければ数字を出力するように書き加えます
for(int i = 1;i < 100;i++){
if(i % 3 == 0){
System.out.println(i + "はFizzです");
}
else if(i % 5 == 0){
System.out.println(i + "はBuzzです");
}
else{
System.out.println(i);
}
}
###結果###
1
2
3はFizzです
4
5はBuzzです
6はFizzです
7
8
9はFizzです
10はBuzzです
11
12はFizzです
13
14
15はFizzです
16
###おや!?###
15がFizzになってる!
これは上の処理で条件が満たされ、下の処理がスキップされるためです
このため、「より狭い」条件から順に書いていくことが必要です
if(i % 3 == 0){
System.out.println(i + "はFizzです"); //ココで条件が満たされ、下の処理がスキップされる
}
else if(i % 5 == 0){
System.out.println(i + "はBuzzです");
##3の倍数かつ5の倍数##
3の倍数なら「Fizz」5の倍数なら「Buzz」、そうでなければ数字を出力するように書き加えます
3の倍数と同時に5の倍数を満たすために、条件式を「&&」でつなげます
i % 3 == 0 && i % 5 == 0
##完成!##
for(int i = 1;i < 100;i++){
if(i % 3 == 0 && i % 5 == 0){
System.out.println(i + "はFizz Buzzです");
}
else if(i % 3 == 0){
System.out.println(i + "はFizzです");
}
else if(i % 5 == 0){
System.out.println(i + "はBuzzです");
}
else{
System.out.println(i);
}
}
##結果##
1
2
3はFizzです
4
5はBuzzです
6はFizzです
7
8
9はFizzです
10はBuzzです
11
12はFizzです
13
14
15はFizz Buzzです
ちゃんと15がFizz Buzzと出力されています
いえい!
##ちなみに##
広い条件から書いていくと・・・
for(int i = 1;i < 100;i++){
if(i % 3 == 0){
System.out.println(i + "はFizzです");
}
else if(i % 5 == 0){
System.out.println(i + "はBuzzです");
}
else if(i % 3 == 0 && i % 5 == 0){
System.out.println(i + "はFizz Buzzです");
}
else{
System.out.println(i);
}
}
##結果##
1
2
3はFizzです
4
5はBuzzです
6はFizzです
7
8
9はFizzです
10はBuzzです
11
12はFizzです
13
14
15はFizzです
やはり「Fizz」が優先され、おかしなことになるので注意です