前後に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;
}