Python中的回文数和水仙花数

2025-12-07 4 0

一、什么是回文数?

回文数就像数字中的"镜子"或"回文"——从左往右读和从右往左读完全相同的整数

简单理解:

  • 就像单词中的"level"、"radar"一样

  • 数字版的"对称"

  • 正着念反着念都一样

例子:

121 → 反过来还是 121 ✅ 是回文数
12321 → 反过来还是 12321 ✅ 是回文数
123 → 反过来是 321 ❌ 不是回文数
10 → 反过来是 01(即1)❌ 不是回文数

二、判断回文数的几种方法

方法1:字符串反转法(最直观)

def is_palindrome_str(num):
    # 转换为字符串,比较正反是否相同
    return str(num) == str(num)[::-1]

# 测试
print(is_palindrome_str(121))   # True
print(is_palindrome_str(123))   # False
print(is_palindrome_str(12321)) # True

方法2:数学方法(反转数字)

def is_palindrome_math(num):
    if num < 0 or (num % 10 == 0 and num != 0):   #排出0本身
        return False
    
    reversed_num = 0
    original = num
    
    while num > 0:
        # 取出最后一位,拼接到反转数
        digit = num % 10
        reversed_num = reversed_num * 10 + digit
        num //= 10  # 去掉最后一位
    
    return original == reversed_num

# 测试
print(is_palindrome_math(121))   # True
print(is_palindrome_math(123))   # False
print(is_palindrome_math(12321)) # True

三、特殊情况的处理

1. 负数是回文数吗?

不是。因为负号不在数字内部对称。

-121 → 反转后是 121- ❌

2. 0是回文数吗?

。0正反读都一样。

0 → 反转后是 0 ✅

3. 以0结尾的数字

不是回文数(除了0本身)。

10 → 反转后是 01(即1)❌
110 → 反转后是 011(即11)❌

四、练习题目

初级题目:

  1. 判断一个整数是否是回文数

  2. 找出100-200之间的所有回文数

  3. 判断一个字符串是否是回文

中级题目:

  1. 找出第n个回文数

  2. 将给定数字变成回文数的最小步骤数

  3. 找出一个回文素数(既是素数又是回文数)

五、总结要点

  1. 定义:从左往右读和从右往左读完全相同的整数

  2. 关键特征:对称性

  3. 特殊情况

    • 负数不是回文数

    • 0是回文数

    • 以0结尾的数(除了0)不是回文数

  4. 判断方法

    • 字符串反转法(最简单)

    • 数学反转法(更高效)

  5. 应用:算法面试常见题,练习基本编程能力

记住最简单的判断方法:把数字转成字符串,看它是否等于自己的反转版本


水仙花数详解

一、什么是水仙花数?

水仙花数(Narcissistic number)也称为自恋数阿姆斯特朗数(Armstrong number),是指一个 n 位数,其各位数字的 n 次方之和等于该数本身

简单定义:

  • 3位数:每个数字的立方和等于这个数本身

  • 4位数:每个数字的4次方和等于这个数本身

  • n位数:每个数字的n次方和等于这个数本身

二、经典例子

1. 三位数的水仙花数(最常见)

153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153 ✅
370 = 3³ + 7³ + 0³ = 27 + 343 + 0 = 370 ✅
371 = 3³ + 7³ + 1³ = 27 + 343 + 1 = 371 ✅
407 = 4³ + 0³ + 7³ = 64 + 0 + 343 = 407 ✅

2. 四位数的水仙花数

1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴ = 1 + 1296 + 81 + 256 = 1634 ✅
8208 = 8⁴ + 2⁴ + 0⁴ + 8⁴ = 4096 + 16 + 0 + 4096 = 8208 ✅

3. 五位数(很少见)

54748 = 5⁵ + 4⁵ + 7⁵ + 4⁵ + 8⁵ = 3125 + 1024 + 16807 + 1024 + 32768 = 54748 ✅

四、找出指定范围内的水仙花数

1. 找出所有三位数的水仙花数

def find_three_digit_narcissistic():
    narcissistic_numbers = []
    for num in range(100, 1000):  # 100到999
        # 分解数字
        hundreds = num // 100
        tens = (num // 10) % 10
        ones = num % 10
        
        # 计算立方和
        total = hundreds**3 + tens**3 + ones**3
        
        # 判断
        if total == num:
            narcissistic_numbers.append(num)
    
    return narcissistic_numbers

# 找出所有三位水仙花数
result = find_three_digit_narcissistic()
print("三位数的水仙花数有:", result)  # [153, 370, 371, 407]

2. 水仙花数列表(已知的)

# 已知的水仙花数(88个)
narcissistic_numbers = [
    1, 2, 3, 4, 5, 6, 7, 8, 9,  # 1位数
    153, 370, 371, 407,         # 3位数
    1634, 8208, 9474,           # 4位数
    54748, 92727, 93084,        # 5位数
    548834,                     # 6位数
    1741725, 4210818, 9800817, 9926315,  # 7位数
    24678050, 24678051, 88593477,       # 8位数
    146511208, 472335975, 534494836, 912985153,  # 9位数
    4679307774                                # 10位数
]

# 注意:水仙花数非常稀有,随着位数增加,数量急剧减少

五、算法理解:手动计算示例

以153为例:

数字:153
位数:3
计算过程:
  1³ = 1
  5³ = 125
  3³ = 27
总和:1 + 125 + 27 = 153
153 == 153 ✅ 是水仙花数

以123为例:

数字:123
位数:3
计算过程:
  1³ = 1
  2³ = 8
  3³ = 27
总和:1 + 8 + 27 = 36
36 ≠ 123 ❌ 不是水仙花数

六、水仙花数的性质

1. 数量有限

  • 水仙花数非常稀有

  • 已知的最大水仙花数有39位数字

2. 位数越多,越稀有

  • 1位数:9个(1-9)

  • 3位数:4个

  • 4位数:3个

  • 5位数:3个

  • 6位数:1个

初级题目:

  1. 判断一个数是否是水仙花数

  2. 找出所有三位数的水仙花数

  3. 找出1000以内的所有水仙花数


七、总结要点

  1. 核心定义:一个n位数,其各位数字的n次方之和等于该数本身

  2. 关键步骤

    • 确定数字的位数n

    • 分离每一位数字

    • 计算每一位的n次方

    • 求和并比较

  3. 经典例子

    • 153 = 1³ + 5³ + 3³

    • 1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴

  4. 特殊性质

    • 一位数都是水仙花数

    • 没有二位数的水仙花数

    • 水仙花数非常稀有

记住最常见的四个三位水仙花数:153、370、371、407


相关文章

博主保姆级教程:足不出户,30分钟在网上免费申领你的个体营业执照
Scratch图形化编程模块化指令说明
老表的由来,为啥很多陌生人一打招呼就是喊老表。
记录下让WordPress文章的段落首行自动空两格
个人如何申请商标?分享下我的成功注册经历
3步搞定Cursor中文汉化!90%程序员不知道的配置秘籍

发布评论

在线客服
我们将24小时内回复。
2025-12-07 16:51:54

您好,有任何疑问请与我们直接联系!

您的工单我们已经收到,我们将会尽快跟您联系!
取消
选择聊天工具: