跳到主要内容

水仙花数与阿姆斯特朗数:153 为什么等于自己各位的立方和

水仙花数就是阿姆斯特朗数在三位上的特例。本文讲清各位数字的位数次方之和等于自身这条规则,用 153 拆给你看,并给出判定算法与编程入门练习思路。

发布于 作者 李雷
#水仙花数 #阿姆斯特朗数 #数论 #编程练习

水仙花数与阿姆斯特朗数:153 为什么等于自己各位的立方和

第一次写编程作业,我也被这道题卡过。题面很短:判断一个数是不是水仙花数。可真正动手才发现,关键不在循环,而在你有没有把那条规则读懂。读懂之后,代码十几行就够了。

这条规则到底说什么

一个数,把它每一位数字单独拿出来,各取位数次方,再加起来。如果加出来的和正好等于原来这个数,它就是阿姆斯特朗数。注意次方等于位数:三位数取三次方,四位数取四次方,七位数就取七次方。

最有名的例子是 153。它有三位,所以每位取三次方:

153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153

各位数字的立方和等于自身,这就是它符合条件的全部理由。你可以亲手验一遍,1 的立方是 1,5 的立方是 125,3 的立方是 27,三个加起来回到 153。这种"数能由自己各位的次方拼回自己"的性质,正是它得名自恋数的来由。

水仙花数和阿姆斯特朗数是一回事吗

基本是一回事。水仙花数是中文里的常用叫法,很多人专门用它指三位的那几个:153, 370, 371, 407。更严格地说,水仙花数是阿姆斯特朗数落在三位上的特例。英文里这族数还叫 narcissistic number,老一点的书里写成 pluperfect digital invariant。叫法不少,规则只有一条。

一万以内有哪几个

一位数 0 到 9 全都算,因为 d 的一次方就是 d,这是平凡的。再往上,两位数里一个都没有,很多人会下意识找一个 10 到 99 之间的小例子,结果是白找。一万以内非平凡的,只有这七个:

153, 370, 371, 407, 1634, 8208, 9474

挑 9474 再验一遍,它有四位,每位取四次方:

9⁴ + 4⁴ + 7⁴ + 4⁴ = 6561 + 256 + 2401 + 256 = 9474

落回 9474,符合。如果你想一次看全这组,用阿姆斯特朗数检测器的范围模式填 0 到 10000,整组会按顺序列出来,一键复制。

怎么写判定算法

思路就三步,和手算一模一样:

  1. 先数这个数有几位,得到次方 d。
  2. 用取余和整除把每一位抠出来,各取 d 次方,累加。
  3. 把累加和和原数比较,相等就是,不等就不是。

第二步是这道题真正要练的地方:取余拿到最低位,整除把这一位去掉,循环到数变成 0 为止。Python 里大概是这样:

def is_armstrong(n):
    d = len(str(n))
    s = sum(int(c) ** d for c in str(n))
    return s == n

如果你想自己练取位逻辑,别用 str,改成 n % 10 拿末位、n //= 10 去末位的写法,这样取余和整除两件事就刻在手上了。

为什么它是编程入门的经典题

这题好就好在,它考的是取位运算和循环控制,却不牵扯任何重算法。没有排序,没有递归非用不可,没有数据结构。新手能在十几行里走完从读题到通过的完整路径,还能顺手踩到一个最常见的坑:用固定次方,把每个数都取立方。对四位数这么做,9474 会算出一个错的和,直接误判成不符合。规则里的次方是跟着位数走的,不是写死的 3。

我自己第一次交作业,就是在 9474 上对不上,盯着检测器打出来的逐项分解才发现,我把四次方写成了三次方。有个能逐位列出中间项的对照,比只给一个是或否的结果有用得多,它会直接告诉你错在哪一步。

顺手玩玩相邻的数

把规则吃透之后,你会想知道为什么十进制下这族数只有有限个。一个直观的感受是:位数一多,最大可能的次方和涨得就追不上数本身了。如果你对这种数的"结构"上瘾,可以再看看质因数分解,从另一个角度拆开一个整数,会发现数字身上能玩的花样远不止一种。

水仙花数不解决什么实际问题,但它把取位、循环、次方这几件最基础的事拧在一道题里,讲清楚一个就够入门了。下次再有人问 153 凭什么特别,你可以直接把 1³ + 5³ + 3³ 写给他看。


Made by Toolora · Updated 2026-06-13