问题描述:
一本书的页码从自然数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)次
* 一次类推
*/