本文共 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(); } }}
0123456789
因此,通过以上方法,我们可以准确计算出页码中每个数字出现的次数。
转载地址:http://yzdyk.baihongyu.com/