カメヲラボ

主にプログラミングとお勉強全般について書いてます

3で割って割って割るのよ〜

今回のコード短縮は、やねさんのところで詳しく語られるだろうからそれはお任せするとして、3で割った数の遇奇偶奇をコントロールするために書いたコードを貼っておく。


001 int ans[]={1,0,1,1,1,0,1,1,1,1,1,0,0,1,0,1,1,1};
002 int buf[1024];
003 int counter=0;
004 main(){
005 int i;
006 f(1,2);
007 for(i=0; i<counter; i++)
008 printf("%x\n",buf[i]);
009 printf("total:%d\n",counter);
010 }
011
012 f(int k, int s){
013 for(;k<18;++k){
014 s*=3;
015 if(ans[k-1]^ans[k]){/*ビットが反転したら1を足す*/
016 s++;
017 } else {/*反転しなかったら何も足さないか、2を足す*/
018 f(k+1,s);
019 f(k+1,s+2);
020 }
021 }
022 add(s);
023 }
024
025 add(s){
026 int i;
027 for(i=0; i<counter; ++i)
028 if(s==buf[i]) return;
029 buf[counter++] = s;
030 }
これらの中から文字リテラルで表示出来そうなものを探すのだが、3での除算を繰り返すと最終的に0になるので、そのひとつ手前の値を決めなければならない。ひとつ手前の値は偶数でなければならないので、main関数の中で2,4,6...と調べていこうと思ったが、2だけでも数十万通り出てきたのでちょっと凹む。もっといい方法があったのだろうか。。。


訂正。自分のプログラムが間違えていた。普通に考えたら、プログラムの分岐箇所が2の9乗あるわけだから、求める値も2の9乗=512通りじゃないとおかしい。

さらに訂正。
mainから呼ぶfの引数は、f(1,2)以外にありえない。ということはすべての可能性は512通りで確定。


次はこの中から、文字リテラルで表示可能なものを選び出す。