%演算子を使わないとか、for文を使わないとか4通りのやり方で。
%演算子を使わないとか、for文を使わないとか4通りのやり方で。
/*
* 1〜50の数字でFizzBuzzやる。
*
* ルール
* 1〜50の数字を総なめし
* 3で割り切れる数字->Fizz
* 5で割り切れる数字->Buzz
* 3と5のどちらでも割り切れる数字->FizzBuzz
* それ以外の場合は数字をそのまま出力する。
*
* 実行結果
* 1
* 2
* Fizz
* 4
* Buzz
* Fizz
* 7
* 8
* Fizz
* 以下略
*
*/
public class FizzBuzz {
private static final int NUM_BGN = 1;
private static final int NUM_END = 50;
public static void main(String[] args) {
System.out.println("FizzBuzzやるよー^q^");
System.out.println("--基本--");
std();
System.out.println("--ループ使わない--");
recursive(NUM_BGN);
System.out.println("--%演算子使わない--");
unuseMod();
System.out.println("--ヘソ曲がり用--");
dataTable();
}
private static void std() {
// スタンダード版
for (int i = NUM_BGN; i <= NUM_END; i++) {
if (i % 15 == 0) { // 3でも5でも割り切れるのは15の倍数
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
private static void recursive(int i) {
// ループを使わない版。
if (i <= NUM_END) {
if (i % 15 == 0) { // 3でも5でも割り切れるのは15の倍数
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
recursive(i+1);
}
}
private static void unuseMod() {
// %演算子を使わない版。
// 3で割った答えに3を掛け算し、検算の結果
// 元の数字に復元できた場合は
// 3の倍数ということになります。
for (int i = NUM_BGN; i <= NUM_END; i++) {
if (i / 15 * 15 == i) {
System.out.println("FizzBuzz");
} else if (i / 3 * 3 == i) {
System.out.println("Fizz");
} else if (i / 5 * 5 == i) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
private static void dataTable() {
// 倍数というものは同じ周期で繰り返される(3と5のFizzBuzzの場合
// 1〜15までのパターンを延々と繰り返す)ため、1〜15までをデータテーブル化。
final String[] tbl = {
null,
null,
"Fizz",
null,
"Buzz",
"Fizz",
null,
null,
"Fizz",
"Buzz",
null,
"Fizz",
null,
null,
"FizzBuzz"
};
for (int i = NUM_BGN; i <= NUM_END; i++) {
int idx = (i-1) % 15;
if (tbl[idx] != null) {
System.out.println(tbl[idx]);
} else {
System.out.println(i);
}
}
}
}