题目:回文数的定义,反转过来后的数字同原数相等,如121,12321。写一个算法判断1-99999之间的数字,有多少个回文数,输出并统计总个数。
算法一:使用字符串的位置索引来实现
将1-99999之间的数字分为几组分别判断:
- 1-999:正数第一位和倒数第一位相等。即 l [0]=l [-1]
- 1000-99999:正数第一位和倒数第一位相等,且正数第二位=倒数第二位。即 l [0]=l [-1] 且 l [1]=l [-2]
当然也可以分为1-9和10-99999两组来判断,是同样的道理。分组的目的是为了避免超出索引范围报错。虽然能实现,但这是最笨的一种实现方式,不利于拓展。
# 最笨的方法,将1-99999之间的数字分为两组1-9,10-99999来分别判断和计数
n1=0
for m in range(10, 100000):
#因为range()函数是包含起点而不包含终点的,所以终点需要再增加一个数字
l=str(m)
#将int转化为支持下标的形式比如字符串
if l[0] == l[-1] and l[1] == l[-2]:
n1 = n1 + 1
print(l)
n2=0
for m in range(1,10):
l=str(m)
if l[0]==l[-1]:
n2=n2+1
print(l)
print (n1+n2)
算法二:使用字符串的位置索引来实现
算法二是对算法一的优化,不进行分组判断,但是为了避免超出索引范围,先计算字符串的位数/2。在索引范围内进行判断,另外总结了反转后的索引和原数字索引的关系为 i = - i -1。
# 反转后的索引和原数字索引的关系为 i = - i -1
n=0
for m in range(1, 100000):
l=str(m)
for i in range(0,int(len(l)/2)):
if l[i] != l[-i-1]:
break
else:
print(l)
n = n + 1
print (n)
算法三:使用字符串的切片来实现
使用字符串切片,str[index:index:step],中括号里面分别为:字符起点、终点和步长。如果 [::-1]则代表字符串反过来
#使用字符串切片,str[index:index:step],中括号里面分别为:字符起点、终点和步长。如果 [::-1]则可以使字符串反过来
n=0
for m in range(1, 100000):
l = str(m)
if l == l[::-1]:
n=n+1
print (l)
print (n)
算法四:使用list列表的reverse()来实现
使用reverse()函数前,需要将原数字转化为list列表,并且反转元素的顺序后,需要将新列表中的元素拼起来,成为一个新的字符串。才能和原字符串比较。
# 使用list列表的reverse()函数
n=0
for m in range(1, 100000):
l=str(m)
list_x=list(l)
list_x.reverse()
# reverse 反转元素的顺序后,需要将元素拼起来成为一个新的字符串
y="".join(list_x)
if y==l:
print (l)
n=n+1
print(n)