…まぁ、正攻法で片付けるとこうなるわな。gcc-3.4.4 使用。
/* * A.C.Clarke's "The Nine Billion Names of God" */ #include <stdio.h> #include <stdlib.h> #define MIN_GOD_NAME_LEN 7 #define MAX_GOD_NAME_LEN 9 char g_name[ MAX_GOD_NAME_LEN + 1 ]; long long g_count; /* int や long じゃ足りんw */ void namesofgod (FILE * fp, int len) { int c, pre; if(len >= MAX_GOD_NAME_LEN) return; pre = -1; if(len >= 2) { if(g_name[len - 2] == g_name[len - 1]) pre = g_name[len - 1] ; } for (c = 'a'; c <= 'z'; c++) { if (c == pre) continue; g_name[len] = c; if (len >= (MIN_GOD_NAME_LEN - 1)) { g_name[len + 1] = '\0'; fprintf (fp, "%10lld %s\n", g_count, g_name); g_count++; } namesofgod (fp, len + 1); } } int main (int argc, char **argv) { char buf[MAX_GOD_NAME_LEN + 1]; FILE * fp; if(NULL == (fp = fopen("result.log", "w"))) { fprintf(stderr, "ログ開けへんがな。\n"); return EXIT_FAILURE; } g_count = 0; namesofgod (fp, 0); fclose(fp); /* そして宇宙は終わる */ return EXIT_SUCCESS; }