そういえば、ソースを上げるといいつつすっかり忘れてた。
気がつけば一ヶ月以上経ってるよぉぃw
/* from A.C.Clarke's "The Nine Billion Names of God" */ #include <stdio.h> #include <stdlib.h> #define MAX_GOD_NAME_LEN 9 #define MIN_GOD_NAME_LEN 7 char g_name[ MAX_GOD_NAME_LEN + 1 ]; long long g_count; /* トータルの件数。 int や long じゃ足りない */ long g_fnum; /* ファイルを作った際の通し番号 */ long g_fcnt; /* 1ファイルあたりの件数カウント */ FILE * g_fp; void names_of_god(int len) { int c, pre; if(len >= MAX_GOD_NAME_LEN) return; pre = -1; if(len >= 2) { if(g_name[ len - 1 ] == g_name[ len - 2 ]) 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'; if(g_fcnt == 0) { char fname[20]; sprintf(fname, "result%03ld.log", g_fnum); if(NULL == (g_fp = fopen(fname, "w"))) { fprintf(stderr, "ログ開けへんがな。(%s)\n", fname); exit(EXIT_FAILURE); } g_fnum++; } fprintf(g_fp, "%10lld %s\n", g_count, g_name); g_count++; /* 全件カウント */ g_fcnt++; /* ファイル内での件数カウント */ /* 1億件単位でファイルを作りなおす。 */ if(g_fcnt >= 100000000L) { fclose(g_fp); g_fcnt = 0; } } names_of_god(len + 1); } } int main(int argc, char **argv) { g_count = 0; g_fcnt = 0; g_fnum = 0; names_of_god(0); /* 最後のファイルは半端であることが予想されるので、ここで閉じる */ if(g_fcnt > 0) { fclose(g_fp); } /* そして宇宙は終わる */ return EXIT_SUCCESS; }
試した環境では、1億件書き出すのに約1.5分程度だから、90億書き出すなら計算上135分程度でおわることに。二時間ちょっとやね。