方法一:逐位判断
原理:用一个while循环,将一个数每次都取出首位和末位,判断是否相等,只要有一次不相等退出即可。
回文数的判断条件:加入一个变量位数,如果这个数是奇数,位数为1时,即最中间那一位数,此时退出即可,同理,偶数,位数为0时,退出。
问题:
- 如何判断位数
- 如何逐位取值
优点: 思路简单
解决:
判断位数下面程序即可
y=x
weishu=0
while x:
weishu+=1
x=x//10
先将判断的x赋值给y,当x不为0时,表明现在x还有位数,位数+1,x/10减少一位,但要记住,用地板除(//)直接得到int整数,否则用/会出现浮点数
逐位取值:
a=y//(10**(weishu-1))
b=y%10
if a!=b:
print("不是回文数。")
break
weishu-=2
y=y//10
y=y%(10**weishu)
取得首位只要地板除以相应的位数,把首位后面的数舍去,比如一个五位数,地板除10000(10的4次方,所以是位数-1),就会得到首位,末尾比较简单,只要对10取模得到余数就是各位,a是首位,b是末位。
判断首尾相等后,先将位数-2,然后将首尾的数字都给删掉,删掉末位//10即可,删掉首位:如果是五位数,现在删掉末位后是四位数,地板与1000取模即可
然后是判断如何判断退出循环
如上文,判断位数最后的值即可
最后判断负数和个位数即可
实现代码如下:
x=int(input("请输入一个正整数:"))
if x<0:
print("不是回文数。")
elif not x//10:
print("是回文数。")
else:
y=x
weishu=0
while x:
weishu+=1
x=x//10
while True:
a=y//(10**(weishu-1))
b=y%10
if a!=b:
print("不是回文数。")
break
weishu-=2
if weishu==1:
print("是回文数。")
break
if not weishu:
print("是回文数。")
break
y=y//10
y=y%(10**weishu)
方法二:得到颠倒后的数判断
原理:每一个回文数从中间切开前后都是相等的,所以得到一个回文数后面的数与前面的数比较即可
那么问题来了,如果是奇位数,怎么判断?
解决: 只要最后得到的前面的数或者后面的数除去末位数与另一个相等即可,因为奇位数中间的数不用管,其他的数相等就可以,所以删去末位判断是否相等
难点: 如何得到后面的数?
每次将后面的数乘上10,然后加上前面数的末位,前面的数地板除10消除末位即可
如何判断后面的数已经取好了,即退出循环的判断条件是:
就是当后面的数已经大于等于前面的数就可以退出循环了
优点: 代码简单
实现程序如下:
hou=0
while(x>hou):
hou=hou*10+x%10
x//=10
if x==hou or x==(hou//10):
print("是回文数。")
else:
print("不是回文数。")
最后判断负数和末位是0但不是0的数,他们一定不是回文数,因为开头不能是0
个位数此程序能够判断,后面的数就是此个位数,地板除10之后和前面一样都是10,即回文数
最终程序:
x=int(input("请输入一个正整数:"))
if x<0 or(x%10==0 and x!=0):
print("不是回文数。")
elif not x//10:
print("不是回文数。")
else:
hou=0
while(x>hou):
hou=hou*10+x%10
x//=10
if x==hou or x==(hou//10):
print("是回文数。")
else:
print("不是回文数。")