Python 判断回文数教程

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,12321 是回文数,而 12345 不是。在本教程中,我们将学习如何使用 Python 判断一个数是否为回文数。

方法一:反转数字法

这是最直观的方法,我们将数字反转后与原数比较。

def is_palindrome(n):
    # 处理负数,负数不可能是回文数
    if n < 0:
        return False
    
    original = n
    reversed_num = 0
    
    while n != 0:
        # 取最后一位
        last_digit = n % 10
        # 将反转后的数乘以10并加上最后一位
        reversed_num = reversed_num * 10 + last_digit
        # 去掉最后一位
        n = n // 10
    
    # 比较原数和反转后的数
    return original == reversed_num

# 测试示例
print(is_palindrome(12321))  # 输出: True
print(is_palindrome(-121))   # 输出: False
print(is_palindrome(12345))  # 输出: False

步骤解析:

  1. 处理负数:负数不可能是回文数,因此直接返回 False。
  2. 反转数字:通过循环逐位提取数字并构建反转后的数。
  3. 比较结果:将原数与反转后的数进行比较。

方法二:字符串反转法

这种方法更简洁,直接将数字转换为字符串后反转比较。

def is_palindrome(n):
    # 将数字转换为字符串
    num_str = str(n)
    # 反转字符串
    reversed_str = num_str[::-1]
    # 比较原字符串和反转后的字符串
    return num_str == reversed_str

# 测试示例
print(is_palindrome(12321))  # 输出: True
print(is_palindrome(12345))  # 输出: False

步骤解析:

  1. 转换为字符串:将数字转换为字符串以便于操作。
  2. 字符串反转:使用切片 [::-1] 反转字符串。
  3. 比较字符串:直接比较原字符串和反转后的字符串。

方法三:数学方法(优化版)

我们可以只反转数字的一半,这样能避免溢出问题并提高效率。

def is_palindrome(n):
    # 处理负数和末位为0的情况(除了0本身)
    if n < 0 or (n % 10 == 0 and n != 0):
        return False
    
    reversed_half = 0
    
    while n > reversed_half:
        # 取最后一位
        last_digit = n % 10
        # 将反转后的数乘以10并加上最后一位
        reversed_half = reversed_half * 10 + last_digit
        # 去掉最后一位
        n = n // 10
    
    # 当数字长度为奇数时,reversed_half会多一位,需要除以10去掉中间位
    return n == reversed_half or n == reversed_half // 10

# 测试示例
print(is_palindrome(12321))  # 输出: True
print(is_palindrome(12345))  # 输出: False
print(is_palindrome(1221))   # 输出: True

步骤解析:

  1. 特殊情况处理:负数和末位为0的数(除了0本身)不是回文数。
  2. 反转一半数字:通过循环逐位提取数字并构建反转后的数,直到原数小于等于反转后的数。
  3. 比较结果:处理奇数长度和偶数长度的情况,确保正确比较。

性能比较

  • 字符串反转法:代码最简单,但可能稍慢,因为涉及字符串转换。
  • 反转数字法:适用于所有情况,但需要处理溢出问题。
  • 优化版数学方法:效率最高,避免了溢出问题,但实现稍微复杂。

根据实际需求选择合适的方法。如果追求简洁,字符串反转法是不错的选择;如果处理大数字或需要高性能,优化版数学方法更合适。

3 条评论

  • @ 2025-5-20 20:41:37
    #判断是否为回文数
    def HuiWenShu(n):
        n=str(n)
        if n==     n[::-1]:  # ③        :
        #if n == "".join(reversed(n)):
            return True
        else:
            return False
    for i in range(11,1001):
        if ZhiShu(i)==True    and HuiWenShu(i) == True:#     ④        :
            print('{}是回文素数!'.format(i))
    
    • @ 2025-5-20 20:38:34
      import math
      def HuiWenShu(n):
          """判断一个数是否为回文数"""
          # 备份原始数值用于后续比较
          bf = n
          # 初始化位数计数器
          cnt = 0
          # 计算数字的位数
          while bf != 0:
              bf //= 10  # 整除10去掉最低位
              cnt += 1   # 位数加1
          # 恢复备份值用于下一步计算
          bf = n
          # 初始化反转后的数值
          res = 0
          # 反转数字的每一位
          while bf != 0:
              # 获取当前最低位,乘以10的相应次幂,累加到结果中
              res += bf % 10 * math.pow(10, cnt - 1)
              bf //= 10  # 整除10去掉最低位
              cnt -= 1   # 剩余位数减1
          # 比较原数和反转后的数是否相等
          if n == res:
              return True
          else:
              return False
      # 测试示例
      print(HuiWenShu(12321))  # 输出: True
      
      
      
      • @ 2025-5-20 20:38:16

        在这段代码中,函数的核心功能是判断一个数是否为回文数。以下是添加了详细注释的代码:

        import math
        
        def HuiWenShu(n):
            """判断一个数是否为回文数"""
            # 备份原始数值用于后续比较
            bf = n
            # 初始化位数计数器
            cnt = 0
            # 计算数字的位数
            while bf != 0:
                bf //= 10  # 整除10去掉最低位
                cnt += 1   # 位数加1
            
            # 恢复备份值用于下一步计算
            bf = n
            # 初始化反转后的数值
            res = 0
            
            # 反转数字的每一位
            while bf != 0:
                # 获取当前最低位,乘以10的相应次幂,累加到结果中
                res += bf % 10 * math.pow(10, cnt - 1)
                bf //= 10  # 整除10去掉最低位
                cnt -= 1   # 剩余位数减1
            
            # 比较原数和反转后的数是否相等
            if n == res:
                return True
            else:
                return False
        
        # 测试示例
        print(HuiWenShu(12321))  # 输出: True
        

        主要注释说明:

        1. 函数定义处添加了文档字符串,说明函数功能
        2. 对关键变量如bfcntres的作用进行了解释
        3. 在两个主要循环处,分别解释了计算位数和反转数字的逻辑
        4. 对核心计算步骤res += ...进行了详细说明
        5. 添加了测试示例和预期输出注释

        这样的注释可以帮助其他开发者快速理解代码的工作原理和实现逻辑。

        • 1