【Python】判断一个整数是否是回文数的三种方法

方法一:逐位判断

原理: 用一个while循环,将一个数每次都取出首位和末位,判断是否相等,只要有一次不相等退出即可。

回文数的判断条件:加入一个变量保存现在剩余的位数,每次取这个数的首位跟末位判断,如果相等那么去掉这个数的首位跟末位。最后如果剩余1位,即最中间那一位数,表明之前我们所有判断首位跟末位都是相等的(如果不相等那么直接判断不是回文数退出)表明这个数是回文数,退出。同理,如果判断位数为偶数,剩余的位数为0时,退出。

问题:

  1. 如何判断位数
  2. 如何逐位取值

优点: 思路简单

解决:

判断位数下面程序即可

	y=x
    weishu=0
    while x:
        weishu+=1
        x=x//10

先将判断的x赋值给y,当x不为0时,表明现在x还有位数,位数+1,x/10减少一位,但要记住,用地板除(//)直接得到int整数,否则用/会出现浮点数(地板除//其实就类似C++中的int除法会去掉小数位,举例3//2=1,因为小数位的0.5被舍掉了)

逐位取值:

		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),就会得到首位(举例23456//10000=2,小数位的0.3456由于是地板除约掉),末位比较简单,只要对10取模得到余数就是个位,a是首位,b是末位。

判断首尾相等后,先将位数-2,然后将首尾的数字都给删掉,删掉末位//10即可,删掉首位:如果是五位数,现在删掉末位后是四位数,地板与1000取模即可(举例,23456,我们首先地板除10,结果就是2345,然后我们再对1000取模2345%1000=345,刚好去掉了首位)

然后是判断如何判断退出循环

如上文,判断位数最后的值(位数最后是1或者0退出)即可

最后判断负数和个位数即可

实现代码如下:

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)# 去掉首位

方法二:得到颠倒后的数判断

原理: 每一个回文数从中间切开前后都是相等的,所以得到一个回文数后面的数与前面的数比较即可

(举例:比如236632这个五位数,我们取前面的236和后面颠倒过来的236判断,这两个数一样说明是回文数)

那么问题来了,如果位数是奇位,怎么判断?(比如23432)

解决: 只要最后得到的前面的数或者后面的数除去末位数与另一个相等即可,因为奇位数中间的数不用管,其他的数相等就可以,所以删去末位判断是否相等(大体意思就是我们把23432分为两部分,前面的23和后面颠倒过来的234,然后把后面的数去掉最后一位跟前面的比较,如果相等就是回文数)

难点: 如何得到后面的数?

每次将后面的数乘上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("不是回文数。")

方法三:字符串处理

原理: 字符串其实是序列,我们只要将字符串倒过来判断是否和原字符串相等就可以了

反转可以用x[::-1](不明白的可以去搜索python列表切片)

实现代码如下

x=input("请输入一个整数:")
if x==x[::-1]:
    print("是回文数。")
else:
    print("不是回文数。")

要是你说还能不能更高级一点,还可以用条件表达式这样写

x=input("请输入一个整数:")
print("是回文数。") if x==x[::-1] else print("不是回文数。")

但是如果他给你一个09890也会报错,具体解决可以先转化为int,再转化为str

最终成品:

x=int(input("请输入一个正整数:"))
x=str(x)
print("是回文数。") if x==x[::-1] else print("不是回文数。")

  • 112
    点赞
  • 394
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值