水仙花数是各位数字的n次方和等于自身的n位正整数;php 8.3中通过获取位数、提取各位并求n次幂累加来判断,支持3~6位范围查找,默认输出153、371、407。

水仙花数(Narcissistic number)是指一个 n 位正整数,其各位数字的 n 次方之和等于它本身。例如:153 是三位数,而 $1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153$,所以它是水仙花数。
PHP 8.3 中判断水仙花数的核心逻辑
关键在于:获取数字位数 n,再将每一位数字提取出来并求 n 次幂,最后累加比对原数。PHP 8.3 支持更严格的类型推导和函数式写法,但本例保持简洁可读,兼容所有 PHP 8.x 版本。
注意:严格来说,水仙花数特指三位数(即 n=3),但常被泛化为“n 位自幂数”。以下代码支持任意位数范围查找(如 3~6 位),并默认输出全部三位水仙花数(153、371、407)。
完整可运行源码(PHP 8.3 兼容)
php
// 定义查找范围:从 100 到 999(三位数)
$start = 100;
$end = 999;
echo "三位水仙花数如下:\n";
for ($num = $start; $num
$str = (string)$num;
$len = strlen($str);
$sum = 0;
// 遍历每位数字,计算 len 次方并累加
for ($i = 0; $i
$digit = (int)$str[$i];
$sum += pow($digit, $len);
}
// 判断是否相等
if ($sum === $num) {
echo "$num\n";
}
}
?>
运行演示与输出结果
将上述代码保存为 narcissistic.php,在 PHP 8.3 环境下执行:
php narcissistic.php
终端输出:
三位水仙花数如下:
153
371
407
✅ 验证说明:
- 153 → $1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153$
- 371 → $3^3 + 7^3 + 1^3 = 27 + 343 + 1 = 371$
- 407 → $4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407$
扩展建议(可选增强)
- 用 str_split() 替代字符串下标遍历,语义更清晰:
$digits = array_map('intval', str_split($str)); - 避免 pow() 对大数产生的浮点误差(如 7^5 可能返回 16806.99999),改用整数乘方循环或 ** 运算符(PHP 8.3 已稳定支持)
- 封装为函数,支持自定义位数范围:
function findNarcissistic(int $minDigits = 3, int $maxDigits = 3): array - 对四位及以上数,起始值应设为
10 ** ($n - 1),结束值为(10 ** $n) - 1,提升效率
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











