縛り FizzBuzz

if, switch, 三項演算子を使わず,更に剰余演算子も使わないでやる FizzBuzz

#include <iostream>

using namespace std;

//0 : number, 1 : Fizz, 2 : Buzz, 3 : FizzBuzz
int function_index_table[15] = {0, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0, 3};
int next_index[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};

void print_number(int x)
{
	cout << x << " ";
}

void print_fizz(int x)
{
	cout << "Fizz ";
}

void print_buzz(int x)
{
	cout << "Buzz ";
}

void print_fizzbuzz(int x)
{
	cout << "FizzBuzz ";
}

typedef void (*print_function_t)(int);
print_function_t print_functions[4] = { print_number, print_fizz, print_buzz, print_fizzbuzz };

int main()
{
	for (int i = 1, index = 0; i <= 100; ++i) {
		(*print_functions[function_index_table[index]])(i);
		index = next_index[index];
	}
	cout << endl;
}