100个python算法超详细讲解:回文数的形成

1.问题描述
任取一个十进制正整数,将其倒过来后与原来的正整数相加,会得到一个新
的正整数,重复以上步骤,则最终可得到一个回文数。请编程进行验证。
2.问题分析
回文数是指这个数无论从左向右读还是从右向左读都是一样的,如121、11
等。
回文数的这一形成规则目前还未得到数学上的验证,还属于一个猜想。有些
回文数的形成要经过上百个步骤,因此此处仅做编程验证,并打印形成过程。
如输入正整数78,则按照问题描述中回文数的形成规则,会有如下形成过
程:
78+87=165
165+561=726
726+627=1353
1353+3531=4884
经过了4步,整数78形成了回文数4884。
3.算法设计
根据问题分析可知,该算法应该包括如下几个功能:
1)求正整数的反序数。
2)判断一个正整数是否为回文数。
3)形成回文数。
上面的这几个功能,我们可以分别通过不同的函数来实现。
4.确定程序框架
(1)求输入正整数的反序数
定义reverse()函数,用于求输入正整数的反序数,代码如下:

# 求反序数
def reverse(a):
t = 0
while a > 0:
t = t * 10 + a % 10 # t中存放的是a的反序数
a //= 10
return t

(2)判断给定的正整数是否为回文数
定义palindrome()函数,用于判断某个正整数是否为回文数,代码如下:

# 判断是否为回文数
def palindrome(s):
if (reverse(s) == s): # 调用reverse()函数判断变量s是否与其反序数相等
return 1 # s是回文数则返回1
else:
return 0 # s不是回文数返回0

上面的代码中调用了reverse()函数判断变量s是否与其反序数相等,若相等,
则s为回文数,palindrome()函数返回1;否则s不是回文数,palindrome()函数返回
0。
(3)形成回文数
在主函数中根据形成回文数的规则来生成回文数,代码如下:

m = reverse(n)
while (palindrome(m + n) == 0): # 判断当前的正整数n是否为回文数
count += 1
print("[%d]:%d+%d=%d " % (count, n, m, m + n)) # 打印操作步骤
n += m # n加上其反序数
m = reverse(n)
count += 1
print("[%d]:%d+%d=%d\n" % (count, n, m, m + n))

上面的代码中加粗的部分用来判断当前的正整数n是否为回文数。接着在while
循环中再次判断n是否为回文数,如果不是则再次执行生成回文数的操作步骤,直
至n为回文数为止,此时退出while循环。
在while循环中,每次n与其反序数m相加时都将其打印出来,这样最后可看到
回文数生成的完整过程。
程序流程图如图10.5所示。

100个python算法超详细讲解:回文数的形成_第1张图片

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 回文数的形成
# 任取一个十进制正整数,将其倒过来后与原来的正整数相加,会得到一个新的正整数。重复以上
步骤,则最终可得到一个回文数
# 求反序数
def reverse(a):
t = 0
while a > 0:
t = t * 10 + a % 10 # t中存放的是a的反序数
a //= 10
return t
# 判断是否为回文数
def palindrome(s):
if (reverse(s) == s): # 调用reverse()函数判断变量s是否与其反序数相等
return 1 # s是回文数则返回1
else:
return 0 # s不是回文数则返回0
if __name__ == '__main__':
# 与C语言不同的是,Python支持大数计算,无限位数
# 对于小整数,它会使用机器自身的整数计算功能去快速计算,当超出机器自身所能支持的范
围时,自动转换为大数计算
n = int(input("请输入一个正整数:"))
print("回文数的产生过程如下:")
count = 0
m = reverse(n)
while (palindrome(m + n) == 0): # 判断当前的整数n是否为回文数
count += 1
print("[%d]:%d+%d=%d " % (count, n, m, m + n)) # 打印操作步骤
n += m # n加上其反序数
m = reverse(n)
count += 1
print("[%d]:%d+%d=%d\n" % (count, n, m, m + n))

 6.运行结果
在PyChram下运行程序,结果如图10.6所示。
注意到在图10.6a中,我们随便输入了一个4位正整数1993,对该整数共进行了
8次生成回文数的操作步骤,最后得到的结果为2 322 232,显然它是一个回文数,
因此验证了该回文数操作规则。
类似地,图10.6b中输入了4位正整数1996,经过5步操作,最后也获得了回文
数。读者可以输入其他4位正整数来对本题中给出的回文数的操作规则进行验证。

100个python算法超详细讲解:回文数的形成_第2张图片

 

你可能感兴趣的:(python,python算法,算法,python)