no_?thumbnail no_?thumbnail

【Java】 Fizz Buzz 問題の Java による解法とその応用問題

プログラミングを覚えたての人が(たぶん)誰もが一度は通る道、Fizz Buzz (フィズバズ)問題。元は言葉遊びのようなゲームをプログラミング問題として昇華させたようなもので、以下のような出力をするプログラムを書け、というのがFizz Buzz 問題の主旨です。

  • 1からnまでの数を順に出力する。ただし、
  • 3の倍数は代わりに”Fizz”を出力する
  • 5の倍数は代わりに”Buzz”を出力する
  • 3と5両方の倍数は代わりに”Fizz Buzz”を出力する

正解はこんな感じになります。

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, ...(以下略)

ここではJavaを使った解答を見ていきます。

必要な知識

環境の構築とかそういった部分はできているものとして、以下の構文は使える必要があります。

  • for 文
  • if-else 文
  • 剰余計算 (a%b)

解答例

可読性を考えると、無理に目新しい構文を使おうとするより単純なfor, if文で書くのが良いでしょう。

public class Main {
  public static void main(String[] args) throws Exception {  //"おまじない"
    for (int i = 1; i <= 100; i++) {        //1~100で実行
      if (i % 15 == 0) {                    //15の倍数の時, Fizz Buzz
        System.out.print("Fizz Buzz, ");
      } else if (i % 3 == 0) {              //3の倍数の時, Fizz
        System.out.print("Fizz, ");
      } else if (i % 5 == 0) {              //5の倍数の時, Buzz
        System.out.print("Buzz, ");
      } else {                              //3の倍数でも5の倍数でもない時, 数字をそのまま出力
        System.out.print(i + ", ");
      }
    }
  }
}

シンプルにこれで問題ありません。コピペフリーですので、自分の環境で実際に走らせてみるなど、ご自由にお使いください。

出力は冒頭に書いたものが出てくるはずです。

Javaを覚えたての方は2行目のの”おまじない”の部分がぱっと出てこないと思いますが、この辺りも慣れで徐々に出てくるようになりますし、IDE(統合開発環境)の設定やオートコンプリート機能に頼ってしまっても構わないと思います。

応用問題 ~4ケタの暗証番号~

twitterで何の気なしにこんないい加減なツイートをしたのですが。

これを真面目に考えてしまったこんな返信が来てしまいました。

中学受験問題にありそうな概観ですが、手計算でこれを解くのは結構厳しいです。

プログラマーならこう解く

プログラムを勉強した人間なら、これは数行かせいぜい十数行のプログラムで一発だな、と感じなければならないところです。練習問題として考えてみてください。

追加の知識として、論理演算子を使用します。

public class Main {
  public static void main(String[] args) throws Exception {
    int count = 0;
    for (int i = 1000; i < 10000; ++i) {
      if (i%2==0||i%3==0||i%5==0||i%7==0) {
        continue;
      }
      if(i%13==0||i%17==0||i%19==0){
        count++;
      }
    }
    System.out.println("answer is " + count);
  }
}
answer is 364

ということで答えは「364個」でした。