Chapter01_1-统计数字问题

统计数字问题

问题描述

​ 一本书的页码从自然数1开始顺序编码直到自然数n。
​ 书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
​ 例如,第6页用数字6表示而不是06或006等。
​ 数字计数问题要求对给定书的总页码n,计算书的全部页码分别用到多少次数字0,1,2,···,9。

算法设计

​ 给定表示书的总页码的十进制数n(1≤n≤10^9),计算书的全部页码中分别用到多少次数字0,1,2,···,9。

数据输入

​ 输入数据由文件名为input.txt的文本文件提供。
​ 每个文件只有1行,给出表示书的总页码的整数n。

结果输出

​ 将计算结果输出到文件output.txt。
​ 输出文件共10行,在第k(k = 1,2,···,10)行输出页码中用到数字k - 1的次数。

input

    11

output

    1
    4
    1
    1
    1
    1
    1
    1
    1
    1

解题思路

遍历页码,对每个页码逐位处理。

代码实现(C)

#include <stdio.h>

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n, count[10] = {0}, num;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        num = i;
        if (num < 10)
            count[num % 10]++;
        else
            while (num) {
                count[num % 10]++;
                num /= 10;
            }
    }
    for (int j = 0; j < 10; ++j)
        printf("%d\n", count[j]);
}

代码实现(C++)

#include <iostream>

using namespace std;

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n, count[10] = {0};
    cin >> n;
    string temp;
    for (int i = 1; i <= n; ++i) {
        temp = to_string(i);
        for (int j = 0; j < temp.size(); ++j)
            count[(int) temp[j] - 48]++;
    }
    for (int k = 0; k < 10; ++k)
        cout << count[k] << endl;
    return 0;
}

经验总结

获取整数的每位数字:
#include <iostream>

using namespace std;

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int num;
    // 方法一:
    cin >> num;
    while (num) {
        int bit = num % 10;
        cout << bit << " ";
        num /= 10;
    }

    cout << endl;

    // 方法二:
    cin >> num;
    string stringNum = to_string(num);
    for (int i = 0; i < stringNum.size(); ++i)
        cout << stringNum[i] << " ";

    return 0;
}

input
3847
1285
output
7 4 8 3 
1 2 8 5 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值