# 第12期—阿姆斯特朗数

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 1 问题描述

如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。
n = 3时,这个数被称为水仙花数。
如:


1-100000的阿姆斯特朗数如下表所示:

位数 阿姆斯特朗数
1 1,2,3,4,5,6,7,8,9
3 153, 370, 371, 407
4 1634, 8208, 9474
5 54748, 92727, 93084

请用户输入最大值与最小值,获取指定区间的阿姆斯特朗数~

# 2 解题思路

  • 用input函数请用户输入查找的区间
  • 用for循环遍历这个区间的数值
  • 判断位数,将数值拆分,计算每个位数上数字的n次方和
  • 将计算出的值与该数值进行比较,若相等,则为阿姆斯特朗数,输出结果

# 3 解题方法

# 方法一

lower = int(input("请输入最小值: "))
upper = int(input("请输入最大值: "))

assert lower > 0 and upper > 0, "请输入正整数!"

for num in range(lower, upper + 1):
    sum = 0
    n = len(str(num))
    temp = num
    
    while temp > 0:
        digit = temp % 10
        sum += digit ** n
        temp //= 10

    if num == sum:
        print(num, end=' ')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

第1-2行: 定义变量lower和upper,分别用input函数获取用户输入的最小值与最大值,int函数将其转换为整型
第4行: 因为对正整数求阿姆斯特朗数,所以用assert断言函数限定变量lower和upper大于0,若大于0,执行后面的代码,否则报错“AssertionError: 请输入正整数!”
第6行: 用for循环遍历最小值与最大值之间所有的数
第7行: 创建变量sum,初始赋值为1,用于存储数值每个位数上数字的n次方和
第8行: 用len函数获取变量num的长度,也即该数值的位数
第9行: 将变量num赋值给变量temp
第11-14行: 用while循环计算每个位数上数字的n次方和,当temp > 0时,进入循环,temp除以10取余,获取该数值的个位数,计算个位数的 n 次方,继续将temp除以10,对商取整,直至temp小于或等于0时退出while循环​
第16-17行: 用if语句判断,若计算出的值与该数值相等,则用print函数输出结果

如,对数值153,n = 3,
digit = 153 % 10 = 3;sum = 0 + 3^3;temp //= 10 后为15,继续进入下一次循环
digit= 15 % 10 = 5;sum = 0 + 3^3 + 5^3;temp //= 10 后为1, 继续进入下一次循环
digit = 1 % 10 = 1;sum = 0 + 3^3 + 5^3 + 1^3,temp //= 10 后为0, 退出while循环​

# 方法二

lower = int(input("请输入最小值: "))
upper = int(input("请输入最大值: "))

assert lower > 0 and upper > 0, "请输入正整数!"

for num in range(lower, upper + 1):
    sum = 0
    n = len(str(num))
    
    for i in str(num):
        sum += int(i) ** n

    if num == sum:
        print(num, end=' ')
1
2
3
4
5
6
7
8
9
10
11
12
13
14

第1-2行: 定义变量lower和upper,分别用input函数获取用户输入的最小值与最大值,int函数将其转换为整型
第4行: 因为对正整数求阿姆斯特朗数,所以用assert断言函数限定变量lower和upper大于0,若大于0,执行后面的代码,否则报错“AssertionError: 请输入正整数!”
第6行: 用for循环遍历最小值与最大值之间所有的数
第7行: 创建变量sum,初始赋值为1,用于存储数值每个位数上数字的n次方和,计算每个位数上数字的n次方和
第8行: 用len函数获取变量num的长度,也即该数值的位数
第10-11行: 用str函数将num转换为字符串类型,for循环遍历字符串中的每一个元素​
第13-14行: 用if语句判断,若计算出的值与该数值相等,则用print函数输出结果

如,对数值153,n = 3,
第一次for循环,i = 1,sum = 0 + 1^3;
第二次for循环,i = 5,sum = 0 + 1^3 + 5^3;
第三次for循环,i = 3,sum = 0 + 1^3 + 5^3+ 3^3 ​

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM