Computer Transformation(1)
- テストコード
短いコードを書くためには、入念に下調べをしておく必要がある。焦ってはいけない。
入力値nの値が1増えるごとに文字列は2倍になっていくので、とりあえずはn=1〜15あたりで出力が出来る程度のコードを書いてみよう。問題の記述通り、1と0からなる文字列を生成し、0のペアを数え上げる単純なものだ。下調べなので素早く仕上げておく。
#include<stdio.h> char v[16][1<<16]; int i,j,k; int ans; main() { v[0][0]='1'; for(i=1;i<16;++i) { for(ans=j=k=0;v[i-1][j]!=NULL;++j) { switch(v[i-1][j]) { case '0': v[i][k++]='0', v[i][k++]='1'; break; case '1': v[i][k++]='1', v[i][k++]='0'; break; } } for(j=1;j<k;++j) if(v[i][j-1]=='0'&&v[i][j]=='0')++ans; // printf("%s\n%d step(s): %d\n\n",v[i],i,ans); printf("n=%2d: %4d\n",i,ans); } }
こいつを実行すると、
n= 1: 0 n= 2: 1 n= 3: 1 n= 4: 3 n= 5: 5 n= 6: 11 n= 7: 21 n= 8: 43 n= 9: 85 n=10: 171 n=11: 341 n=12: 683 n=13: 1365 n=14: 2731 n=15: 5461
この程度値がわかっていれば、規則性がつかみやすい。ここからまず、漸化式を作ってみることにしよう。