博客
关于我
统计数字问题
阅读量:807 次
发布时间:2019-03-25

本文共 3078 字,大约阅读时间需要 10 分钟。

为了计算书籍页码中各数字的出现次数,我们可以按照以下步骤进行分析:

思路说明

为了计算从1到n的页码中,数字0到9分别出现的次数,可以按照以下步骤进行:

  • 确定页码范围:页码从1到n,考虑每个数位上数字0到9的出现情况。

  • 区间划分:将页码分为多个区间,每个区间长度为10^(m),其中m为数位数减一。例如,页码到达4位数,则区间划分为0-9,10-19,……,9900-9999。

  • 计算每个区间的数字出现次数:对于每个区间,计算每个数字在该区间内出现的次数,并累加到总次数。

  • 处理最高位数字:最高位数字的一个完整循环(如1000到1999)需要单独计算,每个数字在该区间内的最高位出现的次数为10^(m-1)。

  • 处理余数部分:对于不完整的区间(如30087到30087),计算余数部分中每个数字出现的次数,包括前面可能存在的前导零。

  • 减去前导零的影响:由于页码不含前导零,只计算真实的页码部分,排除前导零带来的偏差。

  • 代码实现

    import java.io.FileInputStream;import java.io.FileOutputStream;public class DigitCount {    int[] num = new int[10];    int getPeriodNum(int upperBound) {        if (upperBound == 0) {            return 0;        }        int length = (int) Math.log10(upperBound) + 1;        if (length == 1) {            return 1; // 1-digit numbers (0-9)        }        return (int) Math.pow(10, length - 1) + 10 * getPeriodNum(upperBound % 10);    }    void getNum(int n) {        if (n == 0) {            return;        }        int length = (int) Math.log10(n) + 1;        if (length == 1) {            for (int i = 0; i <= n; i++) {                num[i]++;            }            return;        }        int parts = n / ((int) Math.pow(10, length - 1));        int upper = 0;        for (int i = 0; i < length - 1; i++) {            upper += 9 * (int) Math.pow(10, i);        }        int period = getPeriodNum(upper);        for (int i = 0; i < 10; i++) {            num[i] += parts * period;        }        for (int i = 0; i < parts; i++) {            num[i] += (int) Math.pow(10, length - 1);        }        int x = (int) Math.pow(10, length - 1);        int remainder = n % x;        num[parts] += remainder + 1;        if (remainder == 0) {            num[0] += (int) Math.pow(10, length - 1);            return;        }        int len = (int) Math.log10(remainder) + 1;        if (len < length - 1) {            len = length - 1;        }        if (remainder != 0) {            getNum(remainder);            for (int i = 0; i < len; i++) {                num[0] += (int) Math.pow(10, i);            }        }    }    public static void main(String[] args) {        try {            java.io.FileInputStream in = new FileInputStream("input.txt");            int n = in.read() << 8 | in.read();            in.close();            java.io.FileOutputStream out = new FileOutputStream("output.txt");            for (int i = 0; i < 10; i++) {                num[i] = 0;            }            getNum(n);            int length = (int) Math.log10(n) + 1;            for (int i = 0; i < length; i++) {                num[0] -= (int) Math.pow(10, i);            }            for (int i = 0; i < 10; i++) {                out.write(Integer.toString(num[i]).getBytes());                out.write('\n');            }            out.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

    代码解释

    • getPeriodNum函数:递归计算在长度为upperBound的范围内,每个数字的出现次数。
    • getNum函数:计算从1到n的所有页码中,每个数字的总出现次数。处理区间划分、最高位和余数部分。
    • main函数:读取输入数字n,调用getNum函数计算并输出结果。

    使用说明

  • 输入文件:将输入的页码数存储在input.txt文件中。
  • 输出文件:生成output.txt文件,包含0到9每个数字的出现次数。
  • 示例输出

    0123456789

    因此,通过以上方法,我们可以准确计算出页码中每个数字出现的次数。

    转载地址:http://yzdyk.baihongyu.com/

    你可能感兴趣的文章
    免费好用的证件扫描仪-扫描全能王
    查看>>
    面试题5:(事务管理) ACID 是什么?
    查看>>
    10.Mybatis执行流程
    查看>>
    通信过程图
    查看>>
    使用maven
    查看>>
    依赖范围scope
    查看>>
    springboot:集成 Jsp
    查看>>
    python:字符串
    查看>>
    HTML中如何给HTML元素添加事件
    查看>>
    wpf 使用Font Awesome
    查看>>
    Windows10:远程桌面连接报错“出现身份验证错误。要求的函数不受支持”
    查看>>
    lettcode 221. 最大正方形
    查看>>
    0X3协议与数据包
    查看>>
    python解释器环境问题
    查看>>
    uni-app快速导入自己需要的插件
    查看>>
    作为公共组软件工程师如何工作
    查看>>
    编写xor_shellcode.py
    查看>>
    Echarts笔记
    查看>>
    Ubuntu 20.04 Docker 安装并配置
    查看>>
    在 eclipse 中将 web 项目部署到 tomcat 服务器上
    查看>>