注意: この記事は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問題でも、別の解き方で答えてみるとき、どうやって回答すればいいのかを例に挙げてみた。当然ながら、これ以外にも答え方があるので、ぜひともチャレンジしてもらいたい。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。