在王晓东编著的《算法设计与实验题解》中看到的这个问题,问题描述如下:
一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页
码都不含多余的前导数字0。例如第6页用6表示而不是06或006。数字统计问题要求对给定书
的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9。
自己本来的思考很简单就是10个数字,10个数字的去考虑,因为10个数字的尾部是一样。这
个是第一想到的。但到百的时候肯定就是三位的考虑。似乎有点像最好的文章的方法。
题目下面给了一种方法:
考察由0,1,2...9组成的所有n位数。从n个0到n个9共有10^n个n位数。在这10^n个n位数中,
0,1,2.....9第个数字使用次数相同,设为f(n)。f(n)满足如下递推式:
n>1:
f(n) = 10f(n-1)+10^(n-1)
n = 1:
f(n) =1
由此可知,f(n) = n*10^(n-1)。
据此,可从高位向低位进行统计,再减去多余的0的个数即可。
这样程序实现我在博客中找到了@jcwKyl写的文章,网址是
http://blog.csdn.net/jcwkyl/article/details/3009244。
他也写了下自己的想法,下面是他的博客内容:
这个题目有个最容易想到的n*log10(n)的算法。这是自己写的复杂度为O(n*log10(n))的代码:
01.void statNumber(int n) {
02. int i, t;
03. int count[10] = {0};
04.05. for(i = 1; i <= n; i++) {
06. t = i;
07. while(t) {
08. count[t%10]++;
09. t/=10;
10. }
11. }