请用 Python 编写一段程序,用于判断一个给定数字是否为 Armstrong 数(即阿姆斯特朗数,又称自恋数),并说明其判断逻辑。
考察说明
考查候选人对数字运算、循环与条件判断的掌握,以及将一个数学定义转化为代码实现的能力。
回答思路
- 【回答框架 1】Armstrong 数(自恋数)的定义是:一个 n 位数,其各个位上的数字的 n 次方之和等于该数本身,例如 153 = 1^3 + 5^3 + 3^3。
- 【回答框架 2】实现步骤:首先获取数字的位数(可通过将其转为字符串求长度,或循环除以 10 计数);然后依次取出每一位数字,计算其位数次方并累加;最后比较累加和与原数字是否相等。
- 【回答框架 3】代码示例:def is_armstrong(num): s = str(num); n = len(s); sum = 0; for ch in s: sum += int(ch)**n; return sum == num。注意需处理输入为整数且非负的情况。
- 【回答框架 4】边界情况:0 是 Armstrong 数(1 位数,0^1=0);负数和浮点数不在通常讨论范围内,应进行类型检查或转换。
- 【回答框架 5】复杂度为 O(d),d 为数字位数,空间 O(d)(如果使用字符串)。
- 【关键点 1】Armstrong 数定义为各数字的位数次方之和等于原数。
- 【关键点 2】核心算法:求位数、逐位取幂累加、比较相等。
- 【关键点 3】时间复杂度 O(d),d 为位数,空间 O(d) 或 O(1)(如果用循环取余)。
- 【易错点 1】不要将 Armstrong 数与完全数或水仙花数混淆,水仙花数是三位 Armstrong 数,但 Armstrong 数不限于三位。
- 【易错点 2】注意位数计算:不能直接用数字本身作为幂次,否则对多位数会出错。
- 【易错点 3】输入处理需考虑非整数或负数,避免直接报错或得到错误结果。