问题 F: 【递归与递推】计数器
题目描述
一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9。其中—个页码不含多余的0,如N=1234时第5页不是0005,只是5。
输入
一个正整数N(N≤109),表示总的页码。
输出
共十行:第k行为数字k-1的个数。
样例输入
11
样例输出
1
4
1
1
1
1
1
1
1
1
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int b[10], c[10], f[10], m; void slove() { int M = m, n = 0; while(M > 0){ n++; M /= 10; } b[0] = 1; for(int i = 1; i <= 9; i++) { b[i] = 10 * b[i - 1]; } M = m; for(int i = 0; i < n; i++){ c[i] = M % 10; M = M / 10; } for(int i = 0; i <= 9 ; i++){ f[i] = 0; } for(int i = n-1; i >= 1; i--) { for(int k = 0; k <= 9; k++){ f[k] += b[i-1]*i*c[i]; if (k < c[i]) f[k] += b[i]; if(c[i] == k) f[k] += m % b[i] + 1; } } for(int k = 0; k <= 9; k++) { if (k <= c[0]) f[k] += 1; } for(int i = 0; i < n; i++){ f[0] -= b[i]; } // for(int i = n-1; i >= 1; i--){ // for(int k = 0; k <= 9; k++) // f[k] += n % b[i]; // } for(int i = 0; i <= 9; i++){ printf("%d ", f[i]); } } int main() { cin >> m; slove(); return 0; }