PHP计算水仙花数的4种实现方法详解

巷口听风
巷口听风
发布时间:2026-10-14 | 2人浏览过
原创

水仙花数(Narcissistic number)指一个 n 位数(n≥3),其各位数字的 n 次幂之和等于该数本身。最典型的例子是三位水仙花数:153 = 1³ + 5³ + 3³。本文将详细介绍如何使用 PHP 实现这一经典算法,涵盖基础的遍历方法、数学位值分解、高精准度处理以及通用类封装,帮助开发者理解不同场景下的代码实现。

什么是水仙花数

水仙花数也称为自恋数、阿姆斯特朗数或自幂数。对于常见的三位数而言,需满足条件:
百位³ + 十位³ + 个位³ = 原数。
常见的三位水仙花数有:153, 370, 371, 407。

实现方法一:三重循环暴力枚举

这是最直观的方法。通过三个 for 循环分别代表百位(1-9)、十位和个位(0-9),组合出所有三位数并验证条件。

第1步:构建循环结构

定义三个变量 $q(百位)、$w(十位)、$e(个位)。百位范围是 1 到 9,十位和个位范围是 0 到 9。

第2步:验证数值等式

计算 $q*$q*$q + $w*$w*$w + $e*$e*$e,并与拼接后的数值 100*$q + 10*$w + $e 进行比较。若相等则输出结果。

<?php
for($q=1;$q<=9;$q++){
    for($w=0;$w<=9;$w++){
      for($e=0;$e<=9;$e++){
        if($q*$q*$q + $w*$w*$w + $e*$e*$e ==
         100*$q + 10*$w + $e){
           echo "$q $w $e "."<p>";
        }
      }
    }
}
?>

实现方法二:数学分解与函数封装

此方法通过取模(%)和整除运算分离出各个数位,将逻辑封装为独立的验证函数,代码更整洁且易于复用。

第1步:定义立方计算函数

创建辅助函数 cube($n) 返回数字的三次方。

第2步:实现位值分解验证器

在 is_narcissistic($n) 中,使用 floor($n / 100) 获取百位,floor($n / 10) % 10 获取十位,$n % 10 获取个位。判断三者立方和是否等于原数。

<?php
function cube( $n )
{
    return $n * $n * $n;
}

function is_narcissistic ( $n )
{
    $hundreds = floor( $n / 100);    //分解出百位
    $tens = floor( $n / 10 ) % 10;    //分解出十位
    $ones = floor( $n % 10 );    //分解出个位
    return (bool)(cube($hundreds)+cube($tens)+cube($ones) == $n);
}

 
for ( $i = 100; $i < 1000; ++ $i )
{
    if ( is_narcissistic($i) )
        echo $i."\n";
}
?>

实现方法三:支持多位的阿姆斯特朗数检测

上述方法仅适用于三位数。若要查找任意位数的阿姆斯特朗数,需根据数字长度动态计算幂次。注意:普通 PHP 整数乘法在处理较大位数时可能丢失精度,建议启用 BC Math 扩展或使用高精度运算。

第1步:使用 BC Math 进行高精度计算

BC Math 提供高精度的算术运算。使用 bcpow($base, $exp) 计算每个数位的指定次幂并累加。

第2步:动态获取位数与拆分字符

使用 strlen() 获取数字位数作为指数,str_split() 将数字拆分为字符数组遍历计算。

<?php
//阿姆斯特朗数:一个k位数,它的每个位上的数字的k次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)
class Armstrong {
 static function index(){
  for ( $i = 100; $i < 100000; $i++ ) {
   echo self::is_armstrong($i) ? $i . '<br>' : '';
  }
 }
 static function is_armstrong($num){
  $s = 0;
  $k = strlen($num);
  $d = str_split($num);
  foreach ($d as $r) {
   $s += bcpow($r, $k);
  }
  return $num == $s;
 }
}
Armstrong::index();
?>

实现方法四:手动拆解数位逻辑

另一种不依赖内置库函数的思路是通过算术运算手动提取每一位。这种方法虽然代码稍显繁琐,但清晰地展示了数值的数学拆解过程。

第1步:设计数值拆解算法

个位:直接对 10 取余 ($num % 10);
十位:先对 100 取余减去个位,再除以 10;
百位:直接整除 100 并向下取整。

第2步:编写判断函数并调用

创建一个函数接收输入值,内部执行上述拆解与立方求和。若结果等于原值则判定成功。注意此示例限制了输入范围小于 1000。

<html>
<head>
  <title></title>
</head>

<body>

<?php

 function winter($num)
 {
       if($num<1000){
       //定义个位
       $ge=$num%10;
       //定义十位
       $ten=(($num%100)-$ge) /10;
       //定义百位
       /*floor取整,忽略小数点后面的所有数*/
       $hundred=floor($num/100);
       $sum1=$ge*$ge*$ge+$ten*$ten*$ten+$hundred*$hundred*$hundred;
       if($sum1==$num){
               return 1;
                } else{
                        return 0;
                        }                } else{
                       return -1;
                       }
       }

总结

以上四种方法展示了 PHP 中解决水仙花数问题的不同思路。初学者推荐使用第一种和第二种方法掌握基本逻辑;需要处理更大规模或多位数验证时,建议使用基于 BC Math 扩展的第三种方法以保证精度。以上就是PHP实现水仙花数的4种方法的详细内容,更多关于PHP水仙花数的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表