引用元:https://www.ioccc.org/1985/august/august.c
審査員・作者による説明:https://www.ioccc.org/1985/august/hint.html
動作
2進数表記で素数を列挙する。
$ gcc -o august august.c
$ ./august
10
11
101
111
1011
1101
10001
10011
10111
11101
11111
100101
...
解説
初の数学ネタの作品。
関数ポインタと再帰とループとリスト構造が無駄に駆使されたプログラムが本体であり、それをマクロで圧縮している。
struct b
やstruct c
と変数名b
やc
がいやらしい形で同居しており、賞名の通り、かなり見通しが悪いプログラムとなっている。
素数列挙アルゴリズム自体は、試し割りだと思う。
これまでの発見した素数のリストを保持していて、このリストを再帰呼び出しを使ってそのリストをたどりつつ、リストのノードが持つ素数で割り切れたら検査対象の数を1増やして再挑戦する、ということを行っている。
全貌をきちんと理解できていないが、リストをたどるのは関数v
であり、末端に到達したら関数u
によってインクリメントする、という構造になっている。
2進数表記はmain
関数の再帰で実現している。