编程练习1——统计数字问题

该程序用于统计一本总页数为n的书中,页码从1到n中每个数字0到9出现的次数。通过读取'input.txt'文件获取页数,结果输出到'output.txt'。算法基于递推关系,考虑到前导0的情况,并递归处理不同位数的页码。

问题描述:

         一本书的页码从自然数1开始顺序编码直到自然数n。数的页码按照通常习惯编排,每个页码都不含多余的前导数字0.例如:

06,006等。数字统计问题要求对给定书的总页数n,统计出书的全部页码中分别用到多少次0,1,2,...,9

Input : 数据由"input.txt"文件提供,每个文件只有一行,给出表示书的总页数的整数n。

Output : 将程序输出的结果输出到“output”文件中。输出文件有10行,第k行中的数字表示用到数字k-1的次数。

分析:考察由0,1,2,...,9组成的m位数,共有10^m个m位数(考虑前导0),在这些数中0到9这10个数字用到的次数都相同,设为f(n).

则f(n)满足下面的递推关系:

图片

据此可从高位到低位进行统计,再减去多余的前导0的个数

算法:

/**
 * 数字统计算法
 *  n 待统计的数,m为n的位数
 *  设h是n的最高位 ,除去n的最高位h不看,剩下的m-1位数总的
 *  数字统计即是0到9的可重排列共10^(m-1)个,在这10^(m-1)个
 *  数字中0到9各分别出现了(m-1)*10^(m-2)次(注:书上的递推公式)
 *  而最高位包含这样的区间共h个,他们分别是:
 *  I1=[0,10^(m-1)-1],I2=[1*10^(m-2),2*10^(m-1)],...,Ih=[(h-1)*10(m-1), h*10^(m-1)]
 *  且|Ii| = 10^(m-1) i = 1,2,...,h(每个区间中的整数个数);
 *  结论1:从而从[0,h*10^(m-1)]内不包括最高位m位,0到9各出现了h*(m-1)*10^(m-2)次
 *  结论2:0到h-1这些数在最高位出现了10^(m-1)次
 *  结论3:h出现了 n%10^(m-1) + 1次
 *  对h以后的m-1位数做以上操作即可
 *
 *  前导0的计算算法:
 *  考虑一m为的数n,h为最高位
 *  在结论2中0为m位出现了10^(m-1)次
 *  00为最高位和次高为出现了10^(m-2)次
 *  一次类推
 */

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值