php 求水仙花数优化
水仙花数是指一个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 求水仙花数优化的更多相关文章
- 二、求水仙花数,打印出100-999之间所有的"水仙花数"
所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方 public c ...
- js中求水仙花数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python基础----求水仙花数
水仙花数,即一个三位数,各个位上的数字的三次方相加,等于该数本身.如:153 = 1**3 + 5 ** 3 + 3 ** 3 def is_narc_num(n): # if n <100 o ...
- java 求水仙花数
package com.yc.bean; public class ShuiXianHua { public static void main(String[] args) { /** * 题目:打印 ...
- Python小代码_9_求水仙花数
for i in range(100, 1000): ge = i % 10 shi = i // 10 % 10 bai = i // 100 if ge ** 3 + shi ** 3 + bai ...
- C#学习笔记(29)——Linq的实现,Lambda求偶数和水仙花数
说明(2017-11-22 18:15:48): 1. Lambda表达式里面用了匿名委托,感觉理解起来还是挺难的.求偶数的例子模拟了Linq查询里的一个where方法. 2. 蒋坤说求水仙花数那个例 ...
- java求1000以内的水仙花数
水仙花数是指一个 n 位数 ( n>=3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 三位的水仙花数共有4个,分别为:153.370. ...
- PHP水仙花数的实现
php水仙花数是什么? 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153)三位的水仙花数共有4个:153,3 ...
- Java 求解自幂数(水仙花数)
什么是自幂数 如果在一个固定的进制中,一个 n 位自然数等于自身各个数位上数字的 n 次幂之和,则称此数为自幂数. 例如:在十进制中,153 是一个三位数,各个数位的3次幂之和为 1^3+5^3+3^ ...
随机推荐
- Asp.net MVC学习
一.mvc项目的创建并运行 1.启动vs2010 2.新建项目 3.选择Asp.net mvc应用程序 4.不创建测试用例 5.创建之后的效果 6.运行后的mvc程序
- 再来一个学历重要性讨论——QQ技术群聊
----------------------------------------------------------------------- 正方:学历重要 大专,刚毕业那会太坑爹了.太受学历限制. ...
- Spring Boot的启动器Starter详解
Spring Boot的启动器Starter详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot ...
- 清风注解-Swift程序设计语言
前言 Apple 发布了全新的 Swift 程序设计语言,用来开发 iOS 和 OS X 平台的应用程序.其目的不言而喻:就是为了给老迈的 Objective-C 一个合适接班人!因此,不难预见,未来 ...
- poj1799---解析几何
sin(a)=r/R-r,反三角asin(r/R-r),乘以2n=2pi,去化简,得到r 收获:define pi acos(-1) 这样pi的精度会高很多<math.h>(cos,sin ...
- hive集群安装配置
hive 是JAVA写的的一个数据仓库,依赖hadoop.没有安装hadoop的,请参考http://blog.csdn.net/lovemelovemycode/article/details/91 ...
- android上下文
在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder( ...
- Unity 3d 刚体
1.起始的设置如下图: 这是我们运行游戏,方块并不会往下掉. 2.选中CUBE,然后添加刚体 此时再运行,会发现场景的方块会自动掉在地上. 3.我们来看一下刚体的属性 ...
- Canvas路径、描边、填充
<script> var context = document.getElementById('canvas').getContext('2d'); context.font = '48p ...
- Kettle 学习笔记
一直用SSIS做ETL,越来越感觉这玩意不是亲生的.因此萌生换ETL工具的想法,不过Kettle社区版没什么调度系统,貌似错误处理也不是很方便,且先了解吧. 本文简略的记录了整个软件的使用流程. 开始 ...