水仙花数是指一个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. Linux中的那些英文缩写和她的含义们

    系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print working directory 打印工作路径. su:Swith user 切换用户,切换到roo ...

  2. centos6.5编译android-2.2_froyo的几个问题jdk,gcc,arm-gcc

    1.gcc降级 因为之前用QT升级了gcc到4.8.0,现在编译安卓又要降到4.4.6 我这边是直接下的gcc-4.4.6源码安装的 gcc源码安装包下载: ftp://ftp.mpi-sb.mpg. ...

  3. Tempo 2.0

    Tempo 2.0 Tempo is an easy, intuitive JavaScript rendering engine that enables you to craft data tem ...

  4. 介绍几种IC卡

    介绍几种IC卡 Mifare卡:工作频率:13.56MHZ数据保存期:10年 操作时间:96ms读写距离:2.5-10cm   存储容量:8Kbit尺寸:85.6x54x0.76mm 存储器类型:EE ...

  5. rsyslog 配置详解

    格式:: 日志设备(类型).(连接符号)日志级别 日志处理方式(action) 日志设备(可以理解为日志类型): ------------------------ auth –pam产生的日志 aut ...

  6. Redis用户添加、分页、登录、注册、加关注案例

    连接redis代码redis.php <?php //实例化 $redis = new Redis(); //连接服务器 $redis->connect("localhost&q ...

  7. C++实现Http Post请求

    参考资料: http://apps.hi.baidu.com/share/detail/39003388 http://blog.csdn.net/yc0188/article/details/474 ...

  8. poj2105---用指针对数组分块操作

    #include <stdio.h> #include <stdlib.h> ; int pow1(int a,int b) { ,i; ) ; ;i<b;i++) { ...

  9. 执行startx后Ubuntupassword正确进不去的问题

    今天在命令行里敲了 startx ,然后系统重新启动.输入password后,跳转到一下界面.之后又返回到登陆界面.一直这样循环输入password.进不去系统. 然后不得不用手机在网上查找解决的方法 ...

  10. k8s 集群基本概念

    一.概述: kubernetes是google开源的容器集群管理系统,提供应用部署.维护.扩展机制等功能,利用kubernetes能方便管理跨集群运行容器化的应用,简称:k8s(k与s之间有8个字母) ...