问题描述
一本书的页码从自然数 1 1 1 开始顺序编码直到自然数 n n n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字 0 0 0。例如,第 6 6 6 页用数字 6 6 6 表示,而不是 06 06 06 或 006 006 006 等。数字计数问题要求对给定书的总页码 n n n,计算出书的全部页码中分别用到多少次数字 0 , 1 , 2 , ⋯ , 9 0,1,2,\cdots,9 0,1,2,⋯,9。
算法设计
给定表示书的总页码的 10 10 10 进制整数 n ( 1 ⩽ n ⩽ 10 ) n(1\leqslant n\leqslant 10) n(1⩽n⩽10)。编程计算书的全部页码中分别用到多少次数字 0 , 1 , 2 , ⋯ , 9 0,1,2,\cdots,9 0,1,2,⋯,9。
问题分析
对于任意给定的一个自然数,因为它是一个十进制数,很明显按照题目要求找出的统计数字个数必然存在一定规律,本题的难点及重点就是如何发现及找出这样一个规律。
其中, n n n 为数字位数, f ( i ) f(i) f(i) 为当给定十进制数为 i i i 位数时每个数字( 0 0 0 至 9 9 9)的使用次数。
得出规律:从 n n n 个 0 0 0 到 n n n 个 9 9 9 中共有 1 0 n 10^n 10n 个 n n n 位数,其中每个数字 ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ) (0,1,2,3,4,5,6,7,8,9) (0,1,2,3,4,5,6,7,8,9) 的使用次数相同,设为 f ( n ) f(n) f(n).则 f ( n ) f(n) f(n) 满足如下递归公式:
f