0と1を11個ずつ使って22で割り切れるような22桁の整数を作る。
22桁かー。辛いな。私の使えるコンパイル環境に128ビット整数は無いので,以下のようにdcを使って計算するコードを出力する。
#include "puzutl.h"
int bitcnt( int i)
{
return 1の数;
}
cstring conv( int i)
{
static char buf[128];
…2進数を文字列に変換する…
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;
}
実行すると,以下のような出力を得る。全部で184756行ある。
if [ `dc -e "1000000000011111111110 22 % p"` -eq 0 ] ; then echo 1000000000011111111110 / 22 = `dc -e "1000000000011111111110 22 / p"`; fi if [ `dc -e "1000000000101111111110 22 % p"` -eq 0 ] ; then echo 1000000000101111111110 / 22 = `dc -e "1000000000101111111110 22 / p"`; fi if [ `dc -e "1000000000110111111110 22 % p"` -eq 0 ] ; then echo 1000000000110111111110 / 22 = `dc -e "1000000000110111111110 22 / p"`; fi if [ `dc -e "1000000000111011111110 22 % p"` -eq 0 ] ; then echo 1000000000111011111110 / 22 = `dc -e "1000000000111011111110 22 / p"`; fi ………以下略………
この出力をUNIXに持っていって実行する。
結果は1件出力されました。
解速度
シェルプログラムを出力する方はPentiumIII500MHzで約8秒。
シェルプログラムはCeleron1.3GHzで約1時間。