给定一个数字 x,让我们来确定它是否是 Armstrong 数(阿姆斯壮数)。如果一个 n 位 的正整数满足以下条件,我们将其称为 n 阶(阶数即数字的位数)的 Armstrong 数:
abcd… = pow(a,n) + pow(b,n) + pow(c,n) + pow(d,n) + ….
其中 a, b, c 和 d 是输入数字 abcd….. 的各个位数。
示例
> 输入: n = 153
> 输出: true
> 解释: 153 是一个 Armstrong 数,因为 111 + 555 + 333 = 153
>
> 输入: n = 9474
> 输出: true
> 解释: 9^4 + 4^4 + 7^4 + 4^4 = 6561 + 256 + 2401 + 256 = 9474
>
> 输入: n = 123
> 输出: false
> 解释: 1³ + 2³ + 3³ = 1 + 8 + 27 = 36
目录
- [方法 1] 朴素方法
- [方法 2] 使用数字字符串
[方法 1] 朴素方法
> 1. 我们的基本思路是首先统计数字的位数(或者说确定它的阶数)。假设数字的位数为 n。
> 2. 然后,对于输入数字 x 中的每一位数 r,我们计算 r 的 n 次幂。
> 3. 最后,如果所有这些计算结果的和等于 x,我们就返回 true,否则返回 false。
C++
CODEBLOCK_efe741c2
Java
CODEBLOCK_3404de11
Python
CODEBLOCK_952138f4
C#
CODEBLOCK_945070d0
JavaScript
CODEBLOCK_0d750c96
复杂度分析:
- 时间复杂度: O(d),其中 d 是数字中的位数。因为我们要遍历数字的每一位。
n* 空间复杂度: O(1),因为我们只使用了常数个额外变量。
[方法 2] 使用数字字符串
这是一种非常直观的方法。我们可以将数字转换为字符串,这样就可以直接遍历每一位数字了。
算法:
- 首先,我们定义一个函数
armstrong(n),传入数字 n。 - 在函数内部,我们将 n 转换为字符串
str。 - 我们获取字符串的长度,这便是数字的位数
n_len,也就是我们的阶数。 - 初始化一个变量
sum为 0,用于累加各位数字的 n 次幂。 - 我们遍历字符串 INLINECODE393dcc4b 中的每一个字符。对于每一个字符,我们将其转换回整数 INLINECODEaa77ca46。
- 我们计算 INLINECODE3fca841e 的 INLINECODE794cfaa7 次幂,并将结果加到
sum上。 - 最后,我们判断 INLINECODEed8e10ee 是否等于原始数字 INLINECODE008a188c。如果相等,返回 INLINECODE2fdab613,否则返回 INLINECODEa3b4c4f4。
示例:
我们以 n = 153 为例:
-
str= "153"。 -
n_len= 3。 -
sum= 0。 - 第一个字符 ‘1‘,INLINECODEa8f6fe4e = 1,INLINECODEc03dab66 = 0 + 1^3 = 1。
- 第二个字符 ‘5‘,INLINECODEd03f9352 = 5,INLINECODEe65f3fde = 1 + 5^3 = 126。
- 第三个字符 ‘3‘,INLINECODE91932485 = 3,INLINECODE6929c4be = 126 + 3^3 = 153。
- 最终 INLINECODE317d8d74 (153) 等于 INLINECODEf0b7065a (153),所以返回
true。
让我们来看看不同语言的实现:
Python
CODEBLOCK_9f2a74be
JavaScript
CODEBLOCK_66ca6fd7
Java
CODEBLOCK_50fbc0bd
C++
CODEBLOCK_5ea639a2
复杂度分析:
- 时间复杂度: O(d)。其中 d 是数字中的位数,因为我们只遍历了一次字符串。
- 空间复杂度: O(d)。我们需要一个大小为 d 的字符串来存储数字。
这两种方法都可以有效地判断一个数字是否为 Armstrong 数。第一种方法更侧重于数学运算,而第二种方法则更直观,利用了字符串处理的便利性。在实际应用中,我们可以根据具体情况选择合适的方法。