1.题目大意
把前n$(nle 10000)$个整数顺次写在一起:12345678910111213……计算0~9各出现了多少次。
2.思路
第一想法是打表,然而觉得稍微有点暴力。不过暂时没有想到更好的办法了,写完看了一下其它人的思路好像也差不多是打表的思路。
3.应注意的问题
(1)首先是格式问题,我第一次提交的时候PE了,因为没有意识到空格也会有影响。最开始我的最后一段代码是:
for(i=0;i<10;i++) printf("%d ",s[n][i]); printf(" ");
但是事实证明应该写成:
for(i=0;i<9;i++) printf("%d ",s[n][i]); printf("%d",s[n][9]); printf(" ");
(2)打表的时候容易忘记初始化的时候先清零一次。因此在以后用到打表的时候要注意这个问题。
4.代码
#include"stdio.h" #include"string.h" #define maxn 10001 int main() { int s[maxn][10]; int i,j,n,m,T; memset(s,0,sizeof(s));//数组清零 易漏 for(i=1; i<maxn; i++) { m=i; for(j=0; j<10; j++) s[i][j]=s[i-1][j]; while(m>0) { s[i][m%10]++; m/=10; } } scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0; i<9; i++) printf("%d ",s[n][i]); printf("%d",s[n][9]); printf(" "); } return 0; }
参考书目:算法竞赛入门经典(第2版) 刘汝佳 编著