Armstrong 数(阿姆斯壮数/自幂数)详解

给定一个数字 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

在 GfG 练习上试一试!

目录

  • [方法 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 数。第一种方法更侧重于数学运算,而第二种方法则更直观,利用了字符串处理的便利性。在实际应用中,我们可以根据具体情况选择合适的方法。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/47919.html
点赞
0.00 平均评分 (0% 分数) - 0