1134. 阿姆斯特朗数
大约 3 分钟
---
1134. 阿姆斯特朗数
- 标签:数学
- 难度:简单
题目链接
题目大意
描述:给定一个整数 。
如果 是一个 位数,并且它每一位数字的 次方之和正好等于它本身,那么 就是阿姆斯特朗数。
举个例子: 是 3 位数,,所以 153 就是阿姆斯特朗数。
要求:判断 是不是阿姆斯特朗数,是就返回 true,不是就返回 false。
说明:
- (最大 1 亿)。
示例:
- 示例 1:
输入:n = 153
输出:true
解释:
153 是一个 3 位数,且 153 = 1^3 + 5^3 + 3^3。- 示例 2:
输入:n = 123
输出:false
解释:123 是一个 3 位数,且 123 != 1^3 + 2^3 + 3^3 = 36。解题思路
思路 1:逐位拆解 + 累加求和
这个问题的思路非常直接。可以把它想象成「数钱」的过程:拿到一张钞票,先看它有几个数字(是几张?),然后把每个数字分别拿出来,做它自己的几次方,加在一起,最后看看总和和原数是不是一样。
具体的步骤是:
先看这个数有几位。 比如 153 是 3 位数,那么每个数字就要算它的 3 次方。怎么算位数呢?最简单的方法就是把它转成字符串看长度。
把每一位数字单独取出来。 用一种叫做「取模和整除」的技巧:
- 用
n % 10可以拿到最后一位数字(比如 153 % 10 = 3)。 - 用
n // 10可以去掉最后一位(比如 153 // 10 = 15)。 - 重复这个过程,就能从左到右取出每一位。
- 用
对每一位做它的 k 次方,累加起来。 比如 153,依次取出 3、5、1,计算 。
比较累加结果和原数。 相等就是阿姆斯特朗数,不相等就不是。
为什么这样就能判断? 因为这就是阿姆斯特朗数的定义——逐位计算再求和。没有任何隐藏的技巧,按定义做就对了。
思路 1:代码
class Solution:
def isArmstrong(self, n: int) -> bool:
# 第 1 步:算出 n 是几位数
# 把数字转成字符串,字符串的长度就是位数
k = len(str(n))
# 第 2~3 步:逐位取出,计算 k 次方,累加起来
total = 0 # 用来存放累加结果
temp = n # 复制一份,因为后面要修改它
while temp > 0:
digit = temp % 10 # 拿到最后一位数字(比如 153→3)
total += digit ** k # 算它的 k 次方,加到总和里
temp //= 10 # 去掉最后一位(比如 153→15),继续处理下一位
# 第 4 步:判断累加结果是否等于原数
return total == n思路 1:复杂度分析
- 时间复杂度:。用人话说就是: 有几位,我们就处理几次。 最大是 1 亿(8 位数),所以最多跑 8 遍循环,非常快。
- 空间复杂度:。只用了几个固定变量,不随 的大小变化。