UVa 1225 - Digit Counting - ACM/ICPC Danang 2007 解题报告 - C语言

1.题目大意

把前n$(n\le 10000)$个整数顺次写在一起:12345678910111213……计算0~9各出现了多少次。

 

2.思路

第一想法是打表,然而觉得稍微有点暴力。不过暂时没有想到更好的办法了,写完看了一下其它人的思路好像也差不多是打表的思路。

 

3.应注意的问题

(1)首先是格式问题,我第一次提交的时候PE了,因为没有意识到空格也会有影响。最开始我的最后一段代码是:

for(i=0;i<10;i++)
        printf("%d ",s[n][i]);    
    printf("\n");

但是事实证明应该写成:

 for(i=0;i<9;i++)
        printf("%d ",s[n][i]);
        printf("%d",s[n][9]);
    printf("\n");

(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("\n");
    }
    return 0;
}

  

 

 

参考书目:算法竞赛入门经典(第2版) 刘汝佳 编著

posted @ 2016-10-11 20:29  rgvb178  阅读(1324)  评论(0编辑  收藏  举报