Fizz Buzz問題の答え方パターン

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

今回はFizz Buzz問題をコードで書いてみるに関連して、別の解法に基づいた書き方の例を挙げてみたい。中には普通ではやらないようなコードの書き方をしている場合もあるので、その点は要注意である。

回答例(配列を使った場合)

まず提示してみたい方法として、思い切って配列にしてしまうという方法である。この方法は3の倍数だったらFizz、5の倍数だったらBuzz、両方の倍数(公倍数)だったらFizz Buzzを出力するというのを利用して、あらかじめ決め打ちしてしまうというものである。

なお、この方法ではif文は使わない代わりに、三項演算子を使うことになる。また、かなり冗長な記述になるので、個人的にはあまりお勧めできない方法ではある。

サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ARR_SIZE 15
#define STR_LENGTH 64

const char *fizzbuzzmap[ARR_SIZE] = {
    NULL   , // 1
    NULL   , // 2
    "Fizz" , // 3
    NULL   , // 4
    "Buzz" , // 5
    "Fizz" , // 6
    NULL   , // 7
    NULL   , // 8
    "Fizz" , // 9
    "Buzz" , // 10
    NULL   , // 11
    "Fizz" , // 12
    NULL   , // 13
    NULL   , // 14
    "Fizz Buzz", // 15
};

int main(void)
{
    char str[STR_LENGTH] = {0};
    for (int cnt = 0; cnt < 100; cnt++) {
        snprintf(str, STR_LENGTH, "%d", cnt+1);
        const int idx = cnt % ARR_SIZE;
        printf("%s\n", fizzbuzzmap[idx] ? fizzbuzzmap[idx] : str);
        memset(str, 0, strlen(str));
    }
    return EXIT_SUCCESS;
} 

回答例(switch〜case文を使った場合)

次に、switch〜case文を使った場合を例に挙げたい。これは上記の配列を使った方法に似たやり方をswitch〜caseに置き換えた方法に近い。これもハードコーディングになりがちなので要注意である。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    for (int cnt = 1; cnt <= 100; cnt++) {
        switch(cnt % 15) {
        case 0:
            printf("Fizz Buzz\n");
            break;
        case 3:
        case 6:
        case 9:
        case 12:
            printf("Fizz\n");
            break;
        case 5:
        case 10:
            printf("Buzz\n");
            break;
        default:
            printf("%d\n", cnt);
            break;
        }
    }
    return EXIT_SUCCESS;
}

最後に

Fizz Buzz問題でも、別の解き方で答えてみるとき、どうやって回答すればいいのかを例に挙げてみた。当然ながら、これ以外にも答え方があるので、ぜひともチャレンジしてもらいたい。

タイトルとURLをコピーしました