Python每日一练——第9天:判断回文数的两种方式

400 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情

1. 算法描述

  • “回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
  • 设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。 回文数是指正序(从左向右)和倒序(从右向左)都是一样的整数。例如,1221是回文,而1222不是。
  • 注意:
    • 1.偶数个的数字也有回文数124421
    • 2.小数没有回文数

2. 回文数算法

随意找一个十进制的数,把它倒过来成另一个数,再把这两个数相加,得一个和数,这是第一步;然后把这个和数倒过来,与原来的和数相加,又得到一个新的和数,这是第二步。照此方法,一步步接续往下算,直到出现一个“回文数”为n。例如:28+82=110,110+011=121,两步就得出了一个“回文数”。如果接着算下去,还会得到更多的“回文数”。这个过程称为“196算法”。

3. 算法思路

  • 解法一:通过逆转字符串进行比对
  • 解法二:反转一半数字和前半部分的数字进行比较

4. 代码实现

字符串逆转法

通过字符串切片进行逆转

实现代码📝:

def is_palindrome(x):
    # 如果x为负数肯定不是,x末尾是0也不是
    if x<0 or x >0 and x%10==0:
        return False
    str_x = str(x)
    return str_x ==str_x[::-1] # 用切片逆转
print(is_palindrome(1221))
print(is_palindrome(1220))

运行结果: 在这里插入图片描述

反转一半数字

  • 对于整数x,后半部分reverted
  • 每次循环×%10拿到末尾数字
  • 然后×l/ 10去除末尾的数字
  • 循环结束条件x<= reverted 在这里插入图片描述 在这里插入图片描述

实现代码📝:

def is_palindrome(x):
    # 如果x为负数肯定不是,x末尾是0也不是
    if x < 0 or x > 0 and x % 10 == 0:
        return False
    reverted = 0  # 保存逆转后的后半份数字
    while x > reverted:
        reverted = reverted * 10 + x % 10
        x //= 10  # 整除10
    return x == reverted or x == reverted // 10


print(is_palindrome(1221))
print(is_palindrome(1220))

运行结果👇:

在这里插入图片描述