统计字数问题

一本书的页码从自然数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 #include<iostream> 
 2 #include<string.h> 
 3 #include<string> 
 4 #include<cmath> 
 5 using namespace std; 
 6 
 7 //输出1-n之间所有数 0-9出现的次数 
 8 int cnt[10] = {0}; 
 9 int T, n, tmp, cst, rear; 
10 
11 int main() 
12 { 
13     //freopen("in_1.txt", "r", stdin); 
14     //freopen("out_1.txt", "w", stdout); 
15     //scanf("%d", &T); 
16     //while(T--) 
17     //for(int n = 100000; n <= 110000; n++) 
18     while(cin >> n) 
19     { 
20         //cin >> n; 
21         tmp = n; cst = 0; rear = 0; 
22         for(int i = 0; tmp != 0; i++) 
23         { 
24             cst = tmp % 10; 
25             tmp /= 10; 
26 
27             if(i == 0)// 位置 tail 
28             { 
29                 for(int j = 0; j < 10; j++) 
30                 { 
31                     if(j == 0) 
32                     { 
33                         if(tmp != 0) 
34                             cnt[j] += tmp; 
35                     } 
36                     else if(j <= cst) 
37                         cnt[j] += tmp+1; 
38                     else 
39                         cnt[j] += tmp; 
40                 } 
41             } 
42             else if(i > 0 && tmp != 0)// 位置 middle 
43             { 
44                 for(int j = 0; j < 10; j++) 
45                 { 
46                     if(j == 0) 
47                     { 
48                         if(j < cst) 
49                             cnt[j] += tmp*pow(10,(double)i); 
50                         else if(j == cst) 
51                             cnt[j] += (tmp-1)*pow(10,(double)i) + rear+1; 
52                         else // j > cst 
53                             cnt[j] += tmp*pow(10,double(i)); 
54                     } 
55                     else 
56                     { 
57                         if(j < cst) 
58                             cnt[j] += (tmp+1)*pow(10,(double)i); 
59                         else if(j == cst) 
60                             cnt[j] += tmp*pow(10,(double)i) + (rear+1);//tmp*(rear+1); 
61                         else // j > cst 
62                             cnt[j] += tmp*pow(10,double(i)); 
63                     } 
64                 } 
65             } 
66             else// 位置 head 
67             { 
68                 for(int j = 1; j <= cst; j++) 
69                 { 
70                     if(j < cst) 
71                         cnt[j] += (int)pow(10,(double)i); 
72                     else // j == cst 
73                         cnt[j] += rear+1; 
74                 } 
75             } 
76 
77             rear = n % (int)pow(10.0, (double)(i+1)); 
78         } 
79 
80         //out 
81         for(int i = 0; i < 10; i++) 
82             //cout << cnt[i] << endl; 
83             cout << cnt[i] <<endl; 
84         //cout<< endl; 
85         memset(cnt, 0, sizeof(cnt)); 
86     } 
87 } 

 

posted @ 2012-11-09 23:33  川川.aug  阅读(276)  评论(0编辑  收藏  举报