一、摘要
敬告:本人博客将迁移至博客园刘好念的博客!!!以后将逐渐弃用 CSDN。
本文介绍了一种通过模拟寻找十进制镜像数字,然后判断其对应的 k 进制表示
是否也是镜像的方法。具体来讲即从小到大遍历 10 进制的镜像数字,然后对
10 进制镜像数字转为 k 进制,然后判断转为 k 进制后是否还满足镜像。题解
5933【C++】 800ms 三道简单题的组合对本题已经有较为详细的解释,若读者
对本文有所疑问,可以阅读题解 5933【C++】 800ms 三道简单题的组合。
二、题解
本题主要分为三个小问题:
1. 从小到大遍历 10 进制镜像数字;
2. 将十进制镜像数字转为 k 进制表达;
3. 判断 k 进制数字表达是否为镜像;
其中小问题 2.可以通过求余得到;问题 3.可以通过穷举 k 进制数字各位
得到结果。本文将主要对问题 1.进行介绍。
为了从小到大遍历 10 进制镜像数字,我们可以依次讨论不同长度(位数)的数
字:
• 对于长度为 1 的所有 10 进制数字。所有数字都是镜像的(即数字
1,2,3,4,5,6,7,8,9 都是镜像的)。
• 对于长度为奇数的 10 进制数字。例如,长度为 5 的所有 10 进制数字,
其中镜像数字从小到大一定是:10’0’01, 10’1’01, 10’2’
01, …, 11’0’11, 12’1’21, …, 99’0’99, …, 99’9’99。
可以看出,奇数长度的 10 进制镜像数字可以看成由 pre+mid+suf 三部分
组成的(使用’符号分割的三部分),而且 pre 从 10 开始直到 99,中间
的 mid 对于任意 pre 都是从 0 到 9,而 suf 正好是 pre 的反转。因此我
们可以根据此规律从小到达求得长度为奇数的十进制镜像数字。
• 类似的,对于长度为偶数的十进制数字。例如长度为 6 的所有十进制数
字,其中的镜像数字从小到大一定是:100’001, 101’101, 102’
201,…, 999’999。
可以看出偶数长度的十进制镜像数字可以看成 pre+suf 两部分,而且
pre 从 100 开始一直到 999,suf 为 pre 的反转。因此我们也可以根据此
规律从小到大求得长度为偶数的 10 进制镜像数字。
至此,对于不同长度的 10 进制数字,我们都可以根据相应的规律从小到大求得
该长度范围内的镜像数字,然后再判断其转为 k 进制后是否依旧为镜像数字,
找到题目要求的 n 个满足条件的数字即可。
代码如下: