前後にdateコマンドを入れてシェルプログラムを実行した結果は以下の通り。
Fri Nov 11 22:58:53 JST 2005 1010101010101010101010 / 22 = 45913682277318640955 Sat Nov 12 00:01:55 JST 2005
これを吐き出すシェルはちょうど以下の部分。
if [ `dc -e "1010101010101010101010 22 % p"` -eq 0 ] ; then echo 1010101010101010101010 / 22 = `dc -e "1010101010101010101010 22 / p"`; fi
シェルを吐き出すプログラムのソースは以下の通り。
#include "puzutl.h" int bitcnt( int i) { int n = 0; for( int j=0; j< 22; j++) { if( i & 1) n++; i >>= 1; } return n; } cstring conv( int i) { static char buf[128]; astring p = buf; for( int j=0; j< 22; j++) { if( i&1) *p++ = '1'; else *p++ = '0'; i >>= 1; } *p = NIL; char c; for( j=0; j< 11; j++) { c = buf[j]; buf[j] = buf[21-j]; buf[21-j] = c; } return buf; } int main( int argc, cstring argv[]) { for( int i=0x200000; i<= 0x3FFFFF; i+=2) { if( (i&1) == 0 && bitcnt(i) == 11) { // 22で割れるということは2でも割れる,ビットがONは11個 cstring s = conv(i); ps( "if [ `dc -e \"%s 22 %% p\"` -eq 0 ] ; then echo %s / 22 = `dc -e \"%s 22 / p\"`; fi\n", s, s); } } return 0; }