
一、什么是水仙花数水仙花数Narcissistic number也称为自幂数或阿姆斯特朗数Armstrong number这个名字来源于希腊神话中爱上自己倒影的美少年纳西索斯寓意这种数“自恋”地等于自身各位数字的幂次之和。水仙花数的数学定义一个 n 位数n ≥ 3如果它的各位数字的 n 次幂之和等于该数本身则这个数就是水仙花数。用公式表示就是对于一个 N 位数 x如果满足x d₁^N d₂^N ... d_N^N其中 d₁, d₂, ..., d_N 是 x 的各位数字那么 x 就是一个 N 位水仙花数。注意水仙花数必须是三位数或更多位数n ≥ 3。一位数和两位数不参与定义因为它们的次幂和无法满足条件。举个经典例子153 是一个水仙花数因为153 1³ 5³ 3³ 1 125 27-再比如 370370 3³ 7³ 0³ 27 343 0三位数范围内的水仙花数只有4个153、370、371、407。水仙花数其实只是自幂数家族中的一员特指三位数的情况。不同位数的自幂数数量如下-6位数数量示例3位4个153, 370, 371, 4074位3个1634, 8208, 94745位3个54748, 92727, 930846位1个5488347位4个1741725, 4210818, 9800817, 9926315有趣的是已知的水仙花数总共有88 个其中最大的一个是一个39 位数。二、解题思路分析要找出所有的水仙花数核心思路分为三步-第一步确定位数——先判断当前数字是几位数n 的取值。第二步分离各位数字——将数字的每一位都分离出来。第三步计算幂次和并判断——计算各位数字的 n 次幂之和如果等于原数则该数是水仙花数。对于三位水仙花数问题可以进一步简化遍历 100~999 的所有三位数分别取出百位、十位、个位计算它们的立方和与原数比较即可。三、C语言代码实现案例一基础版仅限三位数这是最适合初学者的实现方式直接针对三位数进行求解#include stdio.h int main() { int num, hundreds, tens, units; printf(所有的水仙花数为); for (num 100; num 999; num) { // 分离出百位、十位、个位 hundreds num / 100; // 如 567/100 5 tens (num / 10) % 10; // 如 (567/10)%10 56%10 6 units num % 10; // 如 567%10 7 // 判断立方和是否等于原数 if (hundreds*hundreds*hundreds tens*tens*tens units*units*units num) { printf(%d , num); } } printf(\n); return 0; }运行结果案例二通用版支持任意位数如果要查找更大范围内的水仙花数比如 0~100000就需要写一个更通用的程序。这个版本的核心是先计算数字的位数再按位数求幂次和-。#include stdio.h #include math.h int main() { int num; printf(0~100000 之间的水仙花数为\n); for (num 0; num 100000; num) { int count 0; // 记录位数 int sum 0; // 记录幂次和 int tmp num; // 临时变量避免修改 num // 第一步计算 num 是几位数 while (tmp ! 0) { count; tmp / 10; } // 如果是一位数或两位数跳过水仙花数要求 n ≥ 3 if (count 3) { continue; } // 第二步重新赋值 tmp准备分离各位数字 tmp num; // 第三步分离每一位计算 count 次幂之和 while (tmp ! 0) { int digit tmp % 10; // 取出最低位 sum pow(digit, count); // 累加 count 次幂 tmp / 10; // 去掉最低位 } // 第四步判断是否为水仙花数 if (sum num) { printf(%d , num); } } printf(\n); return 0; }运行结果案例三函数封装版推荐将判断逻辑封装成函数代码更清晰、可复用性更强-#include stdio.h #include string.h int main() { int n; int g,s,b; for(n100; n1000; n){ gn%10; sn/10%10; bn/100; if(ng*g*gs*s*sb*b*b*b) printf(%d,n); } return 0; }运行结果四、常见错误与注意事项1. 混淆“水仙花数”与“自幂数”严格来说水仙花数特指三位数的自幂数-。不过在很多教材和题目中“水仙花数”也被广义地用来指代所有位数的自幂数-。做题时要注意题目具体是要求三位数还是任意位数-。2. 忘记处理 0 和负数0 的各位数字之和为 0有些定义会把它算作特殊情况但通常水仙花数要求 n ≥ 3所以 0 不算。3. 循环变量被意外修改这是初学者最容易犯的错误——直接拿循环变量i去做除法和取余操作导致循环失控。务必使用临时变量tmp来代劳。4. pow 函数的精度问题pow()返回的是double类型在整数运算中可能存在微小的精度误差。对于小范围的计算如 0~100000这个问题可以忽略。如果追求完美可以自己写一个整数幂函数。五、总结水仙花数是 C 语言初学者非常经典的练习题目它综合运用了以下知识点循环结构for / while算术运算除法/和取余%条件判断if 语句函数封装进阶用法通过这个实例我们不仅能掌握如何用数学运算和循环来解决特定的数字问题还能锻炼逻辑思维能力。从简单的三位数求解到支持任意位数的通用解法再到函数封装每一步都是编程能力提升的体现。希望这篇讲解能帮助你彻底理解水仙花数及其 C 语言实现如果你有任何问题欢迎在评论区留言讨论