由于 n 的范围非常大(最高到 1018),我们不可能从 1 遍历到 n 来逐个检查每个数是否为渐进普通数,这样做会超时。
注意到渐进普通数的结构非常特殊,它们的数量相对稀少。这启发我们直接生成所有可能的渐进普通数,然后统计其中有多少个小于或等于 n。
我们可以按照数字的构成方式来生成它们:
定义长度为 L 的十进制正整数 x 为渐进普通数,当且仅当存在 d∈ { 1,...,9 } ,使得 x 满足以下两类之一:
类型 A:x 的 L 个数位都等于 d ;
类型 B:L≥2,x 的前 L−1 个数位都等于 d ,最后一位等于 d+1 (因此 d∈{ 1,...,8 })。