统计数字问题

统计数字问题


Time limit: 1000MS    Memory limit: 32768K
Total Submit: 617    Accepted: 135

 

一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,
每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数
字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,
2,…,9。

给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。计算书的全部页码中分别用到多少
次数字0,1,2,…,9。

每个文件只有1 行,给出表示书的总页码的整数n。

输出文件共有10行,在第k行输出页码中用到数
字k-1 的次数,k=1,2,…,10。

Sample Input

11

Sample Output

1
4
1
1
1
1
1
1
1
1

 

代码
1
2
3 #include<stdio.h>
4 #include<string.h>
5  constint N =10;
6 int ans[N]; //ans[i]存放数字i出现的次数
7 char str[N]; //输入的数字
8 int a[N],len; //a[i]为10^i,len为数字的长度
9
10 void solve(long n) //统计数字n
11 {
12 long m=n+1;
13 memset(ans,0,sizeof(ans));
14 int j,i;
15 for(i=0;i<len;i++)
16 {
17 int x=str[i]-'0';
18 int t=(m-1)/a[len-i-1];
19 ans[x]+=m-t*a[len-i-1];//自左往右到i位数字不变条件下,i位为x的数字个数
20 t=t/10;
21 j=0;
22 while(j<x)
23 {
24 ans[j]+=(t+1)*a[len-i-1];//统计当前位置为j出现的个数
25 j++;
26 }
27 while(j<N) //统计当前位置为j的数目
28 {
29 ans[j]+=t*a[len-i-1];
30 j++;
31 }
32 ans[0]-=a[len-i-1];//消去前导0
33 }
34 for(i=0;i<N;i++)
35 printf("%d\n",ans[i]);
36 }
37
38 int main()
39 {
40 int i;
41 a[0]=1;
42 for(i=1;i<N;i++)
43 a[i]=a[i-1]*10;
44 long n;
45 while(scanf("%s",str)!=EOF)
46 {
47 n=0;
48 len=strlen(str);
49 for(int i=0;i<len;i++)
50 n=n*10+str[i]-'0';
51 solve(n);
52 }
53 return0;
54 }

 

posted @ 2010-12-31 11:04  AndreMouche  阅读(384)  评论(0编辑  收藏  举报