您的位置:首页 > 其它

【递归与递推】计数器

2016-07-04 21:56 218 查看

问题 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\n", f[i]);
}

}
int main() {
cin >> m;
slove();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: