UVa 1225

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版) 刘汝佳 编著

原文地址:https://www.cnblogs.com/rgvb178/p/5950668.html