一、什么是回文数?
回文数就像数字中的"镜子"或"回文"——从左往右读和从右往左读完全相同的整数。
简单理解:
-
就像单词中的"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)❌
四、练习题目
初级题目:
-
判断一个整数是否是回文数
-
找出100-200之间的所有回文数
-
判断一个字符串是否是回文
中级题目:
-
找出第n个回文数
-
将给定数字变成回文数的最小步骤数
-
找出一个回文素数(既是素数又是回文数)
五、总结要点
-
定义:从左往右读和从右往左读完全相同的整数
-
关键特征:对称性
-
特殊情况:
-
负数不是回文数
-
0是回文数
-
以0结尾的数(除了0)不是回文数
-
-
判断方法:
-
字符串反转法(最简单)
-
数学反转法(更高效)
-
-
应用:算法面试常见题,练习基本编程能力
记住最简单的判断方法:把数字转成字符串,看它是否等于自己的反转版本!
水仙花数详解
一、什么是水仙花数?
水仙花数(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个
初级题目:
-
判断一个数是否是水仙花数
-
找出所有三位数的水仙花数
-
找出1000以内的所有水仙花数
七、总结要点
-
核心定义:一个n位数,其各位数字的n次方之和等于该数本身
-
关键步骤:
-
确定数字的位数n
-
分离每一位数字
-
计算每一位的n次方
-
求和并比较
-
-
经典例子:
-
153 = 1³ + 5³ + 3³
-
1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴
-
-
特殊性质:
-
一位数都是水仙花数
-
没有二位数的水仙花数
-
水仙花数非常稀有
-
记住最常见的四个三位水仙花数:153、370、371、407
宗宗酱
