水仙花数是指一个n位数(n>=3),它每一个位上数字的n次幂之和等于它本身,n为它的位数。(比如:1^3+5^3+3^3 = 153)

水仙花数又称阿姆斯特朗数。

三位的水仙花数有4个:153,370,371,407

四位的水仙花数有3个:1634,8208,9474

五位的水仙花数有3个:54748,92727,93084

六位的水仙花数有1个:548834

七位的水仙花数有4个:1741725,4210818,9800817,9926315

八位的水仙花数有3个:24678050,24678051,88593477

.....

最大的水仙花数有39位(115132219018763992565095597973971522401),十进制自然数中的全部水仙花数共同拥有88个。

php 求水仙花数

1.穷举法求水仙花数,求3~7位的水仙花数

<?php
// 穷举求水仙花数
function narcissistic($n){ if($n<3 || $n>39){
return false;
} // 保存执行结果
$result = array(); $start = pow(10,$n-1);
$end = pow(10, $n); for($i=$start; $i<$end; $i++){
$total = 0;
$nums = str_split($i, 1);
foreach($nums as $num){
$total += pow($num, $n);
} if($total==$i){
array_push($result, $i);
}
} return $result; } // 获取当前microtime
function getMicrotime(){
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
} // 设定超时时间为3600秒
set_time_limit(3600); // 记录開始执行时间
$start = getMicrotime(); // 执行求出3~7位的水仙花数
for($i=3; $i<=7; $i++){
$result[$i] = implode(',', narcissistic($i));
} // 记录执行结束时间
$end = getMicrotime(); // 输出执行时间
echo 'run time:'.(float)($end - $start); // 打印结果
echo '<pre>';
print_r($result);
echo '</pre>'; ?>

执行结果:

run time:82.230147838593
Array
(
[3] => 153,370,371,407
[4] => 1634,8208,9474
[5] => 54748,92727,93084
[6] => 548834
[7] => 1741725,4210818,9800817,9926315
)

2.优化算法求水仙花数,求3~7位的水仙花数

优化方法:为pow 创建0-9 N阶的相应表,降低计算次数

<?php
// 优化求水仙花数
function narcissistic($n){ if($n<3 || $n>39){
return false;
} // 保存执行结果
$result = array(); // n阶pow相应表
$powlist = getPow($n); $start = pow(10,$n-1);
$end = pow(10, $n); for($i=$start; $i<$end; $i++){
$total = 0; $nums = str_split($i, 1); foreach($nums as $num){
$total += $powlist[$num];
} if($total==$i){
array_push($result, $i);
}
} return $result; } // 获取当前microtime
function getMicrotime(){
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
} // 获取n阶pow相应表
function getPow($n){
$powlist = array();
for($i=0; $i<=9; $i++){
array_push($powlist, pow($i,$n));
}
return $powlist;
} // 设定超时时间为3600秒
set_time_limit(3600); // 记录開始执行时间
$start = getMicrotime(); // 执行求出3~7位的水仙花数
for($i=3; $i<=7; $i++){
$result[$i] = implode(',', narcissistic($i));
} // 记录执行结束时间
$end = getMicrotime(); // 输出执行时间
echo 'run time:'.(float)($end - $start); // 打印结果
echo '<pre>';
print_r($result);
echo '</pre>'; ?>

执行结果:

run time:47.354328155518
Array
(
[3] => 153,370,371,407
[4] => 1634,8208,9474
[5] => 54748,92727,93084
[6] => 548834
[7] => 1741725,4210818,9800817,9926315
)

结果比对,优化后的算法降低了42%的运行时间。

php 求水仙花数优化的更多相关文章

  1. 二、求水仙花数,打印出100-999之间所有的"水仙花数"

    所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方 public c ...

  2. js中求水仙花数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. python基础----求水仙花数

    水仙花数,即一个三位数,各个位上的数字的三次方相加,等于该数本身.如:153 = 1**3 + 5 ** 3 + 3 ** 3 def is_narc_num(n): # if n <100 o ...

  4. java 求水仙花数

    package com.yc.bean; public class ShuiXianHua { public static void main(String[] args) { /** * 题目:打印 ...

  5. Python小代码_9_求水仙花数

    for i in range(100, 1000): ge = i % 10 shi = i // 10 % 10 bai = i // 100 if ge ** 3 + shi ** 3 + bai ...

  6. C#学习笔记(29)——Linq的实现,Lambda求偶数和水仙花数

    说明(2017-11-22 18:15:48): 1. Lambda表达式里面用了匿名委托,感觉理解起来还是挺难的.求偶数的例子模拟了Linq查询里的一个where方法. 2. 蒋坤说求水仙花数那个例 ...

  7. java求1000以内的水仙花数

    水仙花数是指一个 n 位数 ( n>=3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 三位的水仙花数共有4个,分别为:153.370. ...

  8. PHP水仙花数的实现

    php水仙花数是什么? 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153)三位的水仙花数共有4个:153,3 ...

  9. Java 求解自幂数(水仙花数)

    什么是自幂数 如果在一个固定的进制中,一个 n 位自然数等于自身各个数位上数字的 n 次幂之和,则称此数为自幂数. 例如:在十进制中,153 是一个三位数,各个数位的3次幂之和为 1^3+5^3+3^ ...

随机推荐

  1. Asp.net MVC学习

    一.mvc项目的创建并运行 1.启动vs2010 2.新建项目 3.选择Asp.net mvc应用程序 4.不创建测试用例 5.创建之后的效果 6.运行后的mvc程序

  2. 再来一个学历重要性讨论——QQ技术群聊

    ----------------------------------------------------------------------- 正方:学历重要 大专,刚毕业那会太坑爹了.太受学历限制. ...

  3. Spring Boot的启动器Starter详解

    Spring Boot的启动器Starter详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot ...

  4. 清风注解-Swift程序设计语言

    前言 Apple 发布了全新的 Swift 程序设计语言,用来开发 iOS 和 OS X 平台的应用程序.其目的不言而喻:就是为了给老迈的 Objective-C 一个合适接班人!因此,不难预见,未来 ...

  5. poj1799---解析几何

    sin(a)=r/R-r,反三角asin(r/R-r),乘以2n=2pi,去化简,得到r 收获:define pi acos(-1) 这样pi的精度会高很多<math.h>(cos,sin ...

  6. hive集群安装配置

    hive 是JAVA写的的一个数据仓库,依赖hadoop.没有安装hadoop的,请参考http://blog.csdn.net/lovemelovemycode/article/details/91 ...

  7. android上下文

    在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder( ...

  8. Unity 3d 刚体

    1.起始的设置如下图: 这是我们运行游戏,方块并不会往下掉. 2.选中CUBE,然后添加刚体                 此时再运行,会发现场景的方块会自动掉在地上. 3.我们来看一下刚体的属性 ...

  9. Canvas路径、描边、填充

    <script> var context = document.getElementById('canvas').getContext('2d'); context.font = '48p ...

  10. Kettle 学习笔记

    一直用SSIS做ETL,越来越感觉这玩意不是亲生的.因此萌生换ETL工具的想法,不过Kettle社区版没什么调度系统,貌似错误处理也不是很方便,且先了解吧. 本文简略的记录了整个软件的使用流程. 开始 ...