回文数指的是一个数字正着读和反着读,数字都是一样的,比如1221
回文数的问题一直在算法题里拥有很高的热度。它可以不断变着花样出题,比如特殊的回文数,回文质数…
给大家带来几种回文数的基本求法以及它们的优劣性,欢迎补充:
方法1
while True:
try:
n = int(input('输入一个四位数:'))
if n%10 == n//1000:
if n//10%10 == n//100%10:
print('yes')
else:
print('no')
else:
print('no')
except:
break
根据回文数的性质来判断,既然一个数是回文数,那么它的第一位和最后一位,第二位和倒数第二位…肯定是相同的,我们可以根据这样的性质来判断。
优点:没有用到循环语句,所以运行速度是很快,可以判断一些简单的数字
缺点:首先你必须要知道这个数是一个几位数,当不确定或者一直变化的时候,就要用到很多的if语句,代码长度是不可估量的。再者,当数字特别大的时候,往往不好处理,它的代码量和数字是成正比的。
方法2
while True:
try:
n = int(input('输入一个四位数:'))
if n%10*1000+n//10%10*100+n//100%10*10+n//1000 == n:
print('yes')
else:
print('no')
except:
break
这种方法属于硬方法,完全跟着回文数的思路来,既然要判断回文数,那么倒过来和它相等的数就是回文数。
优点:速度快,可以很快判断一些简单的数。
缺点:和方法一类似,同样需要知道数是几位数。
方法3
while True:
try:
n = int(input())
j = n
sum = 0
while n>0:
sum = sum*10+n%10
n = n//10
if sum == j:
print('yes')
else:
print('no')
except:
break
和方法二的原理相同。
优点:可以判断任意n位数字,方便,灵活
缺点:硬核方法,当一个数字很简单的时候还用这种方法,有点杀鸡用牛刀的感觉。用到了循环,当我们要判断一组数里的回文数,并且这一组数很多很大,运行速度会慢。
方法四
while True:
try:
n = str(input())
a = b = []
for j in n:
a.append(j)
b = a[::-1]
if a == b:
print('yes')
else:
print('no')
except:
break
此方法是将一个str型的数字一个一个切片放入列表中,再将列表反转,如果和原列表相等的话,那么就是回文数。这是一个非常巧妙的方法,虽然用到了循环,但是循环量很少,所以速度运行也非常快。
其它方法
根据方法四可以演变为其他方法,比如在列表中判断第一位和最后一位是否相同…其实都用到了切片的方法,代码本质和方法四相同,且受用程度不是很大。
一般处理一组数字,并且数字不确定时,推荐使用方法四。当处理一些简单的方法时,可以使用前三个方法。
欢迎补充,以及提出疑问。