Python数学之美:水仙花数的算法实现与解析

67 阅读4分钟

一、引言:水仙花数的数学魅力

水仙花数(Narcissistic Number),也称为自幂数或阿姆斯特朗数,是一个具有特殊数学性质的数字。对于三位数的水仙花数,它满足一个美妙的特性:这个数本身等于其各位数字的立方和。这种数字犹如水仙花般"自恋",因此得名。在本文中,我们将通过Python编程来寻找所有的三位水仙花数,这不仅是一个编程练习,更是数学之美在代码中的体现。

二、水仙花数的算法实现

案例:寻找所有三位水仙花数

问题描述:编写程序找出100到999之间所有的水仙花数。水仙花数定义为一个三位数abc,满足a³ + b³ + c³ = abc,其中a、b、c分别是该数的百位、十位和个位数字。

代码展示:

python
 体验AI代码助手
 代码解读
复制代码
#3.编程:求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a³+b³+c³=abc,则abc 是水仙花数。
#三位数abc-->100-999 range(100,1000)
for i in range(100,1000):
    gw = i % 10
    sw = i // 10 % 10
    bw = i // 100
    x = gw*gw*gw+sw*sw*sw+bw*bw*bw
    if (i==x):
        print(i,"是水仙花数")

运行结果:

4.png

代码分析:

  1. 循环范围设置

    • for i in range(100,1000):遍历所有三位数(100到999)
    • range(100,1000)包含100但不包含1000,正好覆盖所有三位数
  2. 数字分解算法

    • 个位提取gw = i % 10

      • 使用取模运算符%获取除以10的余数,即个位数字
      • 例如:153 % 10 = 3
    • 十位提取sw = i // 10 % 10

      • 分两步操作:

        1. i // 10:整数除法去掉个位,得到前两位
        2. % 10:取余数得到十位数字
      • 例如:153 // 10 = 15,15 % 10 = 5

    • 百位提取bw = i // 100

      • 直接除以100取整数部分,得到百位数字
      • 例如:153 // 100 = 1
  3. 立方和计算

    • x = gw*gw*gw + sw*sw*sw + bw*bw*bw
    • 计算个位、十位、百位数字的立方和
    • 例如对于153:1³ + 5³ + 3³ = 1 + 125 + 27 = 153
  4. 条件判断与输出

    • if (i==x): 判断原数是否等于各位数字的立方和
    • 如果相等,则输出该数为水仙花数

三、数学验证与深入理解

让我们验证程序找到的四个水仙花数:

  1. 153:1³ + 5³ + 3³ = 1 + 125 + 27 = 153 ✓
  2. 370:3³ + 7³ + 0³ = 27 + 343 + 0 = 370 ✓
  3. 371:3³ + 7³ + 1³ = 27 + 343 + 1 = 371 ✓
  4. 407:4³ + 0³ + 7³ = 64 + 0 + 343 = 407 ✓

水仙花数在数学上属于"自幂数"的一种。对于n位数,如果满足每个位上的数字的n次幂之和等于该数本身,则称为n位自幂数。三位水仙花数就是n=3的特殊情况。

四、代码优化与扩展

  1. 使用幂运算符优化
python
 体验AI代码助手
 代码解读
复制代码
for i in range(100, 1000):
    num = str(i)
    if i == sum(int(digit)**3 for digit in num):
        print(f"{i} 是水仙花数")

2. 通用自幂数查找函数

python
 体验AI代码助手
 代码解读
复制代码
def find_narcissistic_numbers(digits):
    """查找指定位数的所有自幂数"""
    result = []
    start = 10**(digits-1) if digits > 1 else 0
    end = 10**digits
    
    for num in range(start, end):
        total = sum(int(d)**digits for d in str(num))
        if total == num:
            result.append(num)
    
    return result

# 查找三位水仙花数
print("三位水仙花数:", find_narcissistic_numbers(3))

3. 四位数水仙花数(四叶玫瑰数)查找

python
 体验AI代码助手
 代码解读
复制代码
# 查找四位自幂数(四叶玫瑰数)
for i in range(1000, 10000):
    a = i // 1000
    b = i // 100 % 10
    c = i // 10 % 10
    d = i % 10
    if a**4 + b**4 + c**4 + d**4 == i:
        print(f"{i} 是四叶玫瑰数")