C で FizzBuzz

ふと思い付いて C で FizzBuzz を書いてみた。

#include <stdio.h>

int main(void) {
	int count;

	for (count = 1; count <= 100; count++) {
		if (count % 15 == 0) {
			printf("FizzBuzz\n");
		} else if (count % 3 == 0) {
			printf("Fizz\n");
		} else if (count % 5 == 0) {
			printf("Buzz\n");
		} else {
			printf("%d\n", count);
		}
	}

	return 0;
}

FizzBuzz 問題の解説。
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
http://ja.wikipedia.org/wiki/Fizz_Buzz

なんでこれが2分で書けないかあまり理解できないが(汗)、おそらく条件分岐のところで「ダブり」や「漏れ」が出てくるのだろう(と推測)。
厳密に考え過ぎるのが癖な自分は逆に、「15の倍数のときは、"FizzBuzzFizzBuzz" と出力するのだろうか?」なんて考えてました。


これだけではつまらないので、色々縛りを加えて遊んでみる。

// FizzBuzz 問題に剰余記号"%"を用いずに挑戦!!
// 手動で"%"を作ったのと同じ。あまり納得いかない。

#include <stdio.h>

int main(void) {
	int count, subCount3, subCount5;

	for (count = 1, subCount3 = 1, subCount5 = 1; count <= 100; count++, subCount3++, subCount5++) {
		if (subCount3 == 3 && subCount5 == 5) {
			printf("FizzBuzz\n");
			subCount3 = 0;
			subCount5 = 0;
		} else if (subCount3 == 3) {
			printf("Fizz\n");
			subCount3 = 0;
		} else if (subCount5 == 5) {
			printf("Buzz\n");
			subCount5 = 0;
		} else {
			printf("%d\n", count);
		}
	}

	return 0;
}

C にはコンマ演算子","なんてものがあるので、for ループの中で複数のカウンタを持ったりできる。


お次は再起呼び出しを使って FizzBuzz。色んな FizzBuzz を調べていく途中で、"%d" っていうのも文字列として返せることを(恥ずかしながらやっと)知った(滝汗)

#include <stdio.h>

char *output[] = {"%d\n", "%d\n", "Fizz\n", "%d\n", "Buzz\n"
				  , "Fizz\n", "%d\n", "%d\n", "Fizz\n", "Buzz\n"
				  , "%d\n", "Fizz\n", "%d\n", "%d\n", "FizzBuzz\n"};

char *fizzbuzz(int);

int main(void) {
	int count;

	for (count = 1; count <= 100; count++) {
		printf(fizzbuzz(count), count);
	}

	return 0;
}

char *fizzbuzz(int i) {
	if (i>15) {
		return fizzbuzz(i-15);
	} else {
		return output[i-1];
	}
}