每个人的Python:数学、算法和游戏编程训练营
上QQ阅读APP看书,第一时间看更新

3.11.2 代码改进——查找指定位数的中心对称数

我们已经知道,中心对称数是指旋转180度看起来依然一样的数,那么尝试编程找到长度为n的所有中心对称数,例如当n等于2时的所有中心对称数为11、69、88和96。

题目稍微变化了一下,但是难度增加了不少。要解决这道题,还是要从中心对称数的性质着手。中心对称数如果是奇数位的,那么最中间的数一定是0、1、8这3个数字中的一个,因为只有这3个数字旋转180度后依然与自身相等。并且从中心开始向两边扩展,两边的数字一定是成对出现的,即00、11、88、69和96这5对数字。如果是偶数位的,则从左向右与从右向左依次取到的数字一定是成对的。理解了这些特点,我们就很容易解决这道题。示例代码如下:

如以上代码所示,我们首先定义了3个特殊的列表,分别命名为S、D和d。其中,S列表中存放的是只有一位数字的中心对称数,D列表中存放的是广义上两位的中心对称数,d列表中存放的是狭义上两位的中心对称数(去掉0)。上面的代码使用到了递归的编码技巧,递增位数地去构造中心对称数,直到最终的位数满足要求。