Java 3の倍数や5の倍数を判定する方法(FizzBuzz問題)

Javaで3の倍数や5の倍数を判定する方法です。

Java 3の倍数や5の倍数を判定する方法(FizzBuzz問題)

倍数の定義をおさらいしておくと「整数 a の倍数とは、a で割り切れる整数のこと」です。Java で整数がその倍数であるかを調べるには、剰余演算子である「%」を使い、余りがあるかどうかによって判定できます。余りがある場合は、その整数の倍数ではなく、余りが 0 の場合にはその整数の倍数であると判断できます。判定は整数でなくてもできますが、わかりにくくなるのであえて整数としています。

ここでは Javaで3の倍数や5の倍数を判定する方法 と、サンプルとして FizzBuzz(フィズ・バズ)問題 を取り上げて説明します。


3の倍数や5の倍数を判定する

判定には「%」演算子(剰余)を使います。


// 3の倍数の場合
if ( i % 3 == 0  ) {
  System.out.println("Fizz");
}
// 5の倍数の場合
if ( i % 5 == 0  ) {
  System.out.println("Buzz");
}

このように、余りが 0 かどうかを判定して、3の倍数もしくは5の倍数であることを判断します。

JavaでFizzBuzz問題

FizzBuzz というゲームを Java でやりたいと思います。もともと単純なパーティーゲームで、2人以上で1から順番に数字を発言し、3で割り切れるときは「Fizz」、5で割り切れるときは「Buzz」、両方で割り切れるときは「FizzBuzz」を発言するというものです。プログラム言語を問わず作れるということと、プログラマーの実力を測るテストにも流用されたりするので、ご存知ない方はこれを機に覚えておくのもよろしいかと思います。

仕様はこうです。

  • 1から100までの整数を順番にターミナルに表示する
  • 3で割り切れるときは「Fizz」という文字列を表示する
  • 5で割り切れるときは「Buzz」 という文字列を表示する
  • 両方で割り切れるときは「FizzBuzz」という文字列を表示する

仕様で勘違いしやすいのが 1 から 100 までの整数を表示ってところですかね。0 から開始ではダメですし、99 で終わってもダメです。間違えないようにしましょう。

一般的にはこんな感じのコードになると思います。


/**
 * 3の倍数や5の倍数を判定する方法
 * FizzBuzz問題
 */
public class FizzBuzz {
  public static void main(String[] args) {
    // 1から100までループ
    for ( int i = 1; i <= 100; i++ ) {
      // 3の倍数且つ、5の倍数の場合
      if ( i % 3 == 0 && i % 5 == 0 )
        System.out.println("FizzBuzz");

      // 3の倍数の場合
      else if ( i % 3 == 0 )
        System.out.println("Fizz");

      // 5の倍数の場合
      else if ( i % 5 == 0 )
        System.out.println("Buzz");

      // いずれでもない場合
      else
        System.out.println(i);
    }
  }
}

上の記述のポイントは if 文の一番最初に、3 と 5 の倍数の判定を記述しているところです。これが else if で一番下に書いてあると、「FizzBuzz」という文字列は表示されなくなってしまいます。つまり、最初に厳しい条件で判定すれば以降の処理はおこなわれないという、 if 文の特性を生かしてコーディングしているといったところでしょうか。


// ★★★ダメな書き方
// 3の倍数の場合
if ( i % 3 == 0 )
  System.out.println("Fizz");

// 5の倍数の場合
else if ( i % 5 == 0 )
  System.out.println("Buzz");

// ↓★★★この位置じゃダメ
// 3の倍数且つ、5の倍数の場合
else if ( i % 3 == 0 && i % 5 == 0 )
  System.out.println("FizzBuzz");

// いずれでもない場合
else
  System.out.println(i);

最小公倍数を使う方法も考えられますね。3 と 5 の最小公倍数は 15 ですので、コードを書くとこうなります。


// 3の倍数且つ、5の倍数の場合
//if ( i % 3 == 0 && i % 5 == 0 )
if ( i % 15 == 0 )
  System.out.println("FizzBuzz");

// 3の倍数の場合
else if ( i % 3 == 0 )
  System.out.println("Fizz");

// 5の倍数の場合
else if ( i % 5 == 0 )
  System.out.println("Buzz");

// いずれでもない場合
else
  System.out.println(i);

仕様をもう少し深堀し、言い方を変えてみると別の記述になります。

  • 3の倍数で、5の倍数でない場合
  • 5の倍数で、3の倍数でない場合
  • 3の倍数と、5の倍数の場合

こんな感じのコードになると思います。


/**
 * 3の倍数や5の倍数を判定する方法
 * FizzBuzz問題
 */
public class FizzBuzz {
  public static void main(String[] args) {
    // 1から100までループ
    for ( int i = 1; i <= 100; i++ ) {

      // 3の倍数で、5の倍数でない場合
      if ( i % 3 == 0 && i % 5 != 0 )
        System.out.println("Fizz");

      // 3の倍数でなく、5の倍数の場合
      else if ( i % 3 != 0 && i % 5 == 0 )
        System.out.println("Buzz");

      // 3の倍数且つ、5の倍数の場合
      else if ( i % 3 == 0 && i % 5 == 0 )
        System.out.println("FizzBuzz");

      // いずれでもない場合
      else
        System.out.println(i);
    }
  }
}

ふむ、こうすると 3 と 5 の倍数の判定を記述を一番下に書けますね。

まとめ

Javaで3の倍数や5の倍数を判定する方法を紹介しました。

FizzBuzz問題って比較的基礎的な問題ですけど、様々な記述方法ができるので、どれが正解とかないんじゃないでしょうかね。三項演算子で条件分岐する人もいるでしょうし、for 文以外を使ってループさせる人もいるでしょう。最小のコードにこだわれば3行くらいで書ける気もしますが、可読性が低下するので私はやりませんけどね。でもやる人もいるでしょうから。

いいプログラムってなんだって言われれば、そんな定義は人それぞれな気がしますね。個人的には可読性がよく、バグの出ないようなコーディングを目指していますけど、ちゃんとできているかは誰にもわからないんじゃないかなー・・・(そんなことない?)。

その時々の場面や状況に応じて、ベストなコードを書けるように心がけたいですね。

皆さんも試してみてください。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。