一本书的页码从自然数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 }