首先来看看概念:
如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。
例如1^3 + 5^3 + 3^3 = 153
当n=3时,又称水仙花数,特指一种三位数,其各个数之立方和等于该数。
水仙花数共有4个,分别为:153、370、371、407。
根据这个概念,可以直接实现
<?php
class Algorithm
{
public function __contruct()
{
}
/**
* @name 获取指定范围内的阿姆斯特朗数
* @param $max
* @return array
*/
public function getArmstrong($max)
{
$arr = array();
for($i = 0; $i <= $max; $i++){
$arms = $this->armstrong($i);
if($arms){
$arr[] = $i;
}
}
return $arr;
}
/**
* 阿姆斯特朗数
* @param $m 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。
例如1^3 + 5^3 + 3^3 = 153
当n=3时,又称水仙花数,特指一种三位数,其各个数之立方和等于该数。
水仙花数共有4个,分别为:153、370、371、407。
*/
private function armstrong($m)
{
if($m == 0){
return true;
}
$len = strlen($m);
//echo $m.'--'.$len.'<br/>';
$sum = 0;
$m = (string)$m;
//echo $m;
for($i = 0; $i < $len; $i++){
$sum = $sum + pow($m[$i], $len);
}
//echo $sum.'<br/>';
if($sum == $m){
return true;
}
return false;
}
}
$algo = new Algorithm();
echo '<pre>';
$data = $algo->getArmstrong(10000000);
print_r($data);
die();
运行结果
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 8
[9] => 9
[10] => 153
[11] => 370
[12] => 371
[13] => 407
[14] => 1634
[15] => 8208
[16] => 9474
[17] => 54748
[18] => 92727
[19] => 93084
[20] => 548834
[21] => 1741725
[22] => 4210818
[23] => 9800817
[24] => 9926315
)