水仙花数与阿姆斯特朗数: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,整组会按顺序列出来,一键复制。
怎么写判定算法
思路就三步,和手算一模一样:
- 先数这个数有几位,得到次方 d。
- 用取余和整除把每一位抠出来,各取 d 次方,累加。
- 把累加和和原数比较,相等就是,不等就不是。
第二步是这道题真正要练的地方:取余拿到最低位,整除把这一位去掉,循环到数变成 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