递归与递推计数器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与递推计数器相关的知识,希望对你有一定的参考价值。

问题 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

 

以上是关于递归与递推计数器的主要内容,如果未能解决你的问题,请参考以下文章

递归与递推一

递归与递推一

推箱子,递归与递推

递归与递推电话号码

递归与递推电话号码

递归与递推排序集合