0から1000までの0の数を数える
昨日のエントリはちょっとだけ祭りっぽくなったみたい。
# でも炎上とまではいかない。やはり炎上させるには「残念な0~1000」とか「0~1000まで数えるお作法(常識)」みたいなエントリにすべきだった。
今日は、昨日の拡張で、今度は0~1000までの数に含まれる0~9それぞれを数えてみる。
int n,c,i,j;main(){for(;j<10;printf("%d:%d\n",j,c),j++)for(c=i=n=0;i<1001;n=++i)while(c+=(n%10==j),n/=10);}
まだ140字以内。
出力結果
0:193
1:301
2:300
3:300
4:300
5:300
6:300
7:300
8:300
9:300
まだ140字以内。
出力結果
16進数だとこんな感じ
int n,c,i,j;main(){for(;j<16;printf("%x:%d\n",j,c),j++)for(c=i=n=0;i<0x1001;n=++i)while(c+=(n%16==j),n/=16);}
出力結果
0:499
1:769
2:768
3:768
4:768
5:768
6:768
7:768
8:768
9:768
a:768
b:768
c:768
d:768
e:768
f:768
※自分で数えて確認してないから間違っているかもしれません。
昨日のエントリにコメントをいただいて、プログラムも見てみたのですが、やはり数値を文字列化して、その中の”0”の数を数える方法が多いですね。
その方法も1つの値ごとに文字列化して数える方法と、全数値の文字列を連結してから0を数える方法がありました。後者の方が簡潔になるでしょう。
僕が使っている方法は
- 値の10の余りを計算し、その余りがカウントする数値と一致していたらインクリメント
- 値を10で割る
- 値が0でなければ1へ、0になったら終了
これを0~1000までに対して行っています。
while(c+=(n%10==j),n/=10);
この部分のnが値、cがカウンタです。