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
)

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/PHP/

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高手
, 结果
, 水仙花数
, 求显示十进制数
, 语言 水仙花数算法
, 407
, 求中位数
, java水仙花数
水仙花
php求水仙花数的算法、php求10000水仙花数、php水仙花数、php curl请求优化、求水仙花数,以便于您获取更多的相关知识。

时间: 2024-10-31 03:44:53

php中如何求水仙花数优化的相关文章

java我写的这个求水仙花数为什么算不出来

问题描述 java我写的这个求水仙花数为什么算不出来 import java.util.Scanner; public class Task1{ public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个数"); int number = input.nextInt(); double s=0; int[] a={0}; int i; f

这是求水仙花数的代码,请大神指出错误

问题描述 这是求水仙花数的代码,请大神指出错误 程序运行得不出结果 解决方案 #include void main() { int i,a,b,c; printf("水仙花数:n"); for(i=100;i<=999;i++) { a=i/100 ; b=(i-100*a)/10 ; c=i-100*a-10*b; if(i==a*a*a+b*b*b+c*c*c) printf("%dn",i); } } 解决方案二: #include <stdio.

java求水仙花数--简单

1 public class hello { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 int ge = 1000; 8 int shi = 0; 9 int bai = 0; 10 int sxnum = 0; 11 for (int i = 100; i < 1000; i++){ 12 ge = i % 10; 13 shi = (i / 10) % 10; 14 bai = i /

printf-求水仙花数(即一个数等于他的个十百位数字的立方和)。这样写为什么不正确?

问题描述 求水仙花数(即一个数等于他的个十百位数字的立方和).这样写为什么不正确? int n,g,s,b; for(n=100;n<1000;n++) { g=n%10; s=(n/10)%10; b=n/100; n=g*g*g+s*s*s+b*b*b; printf("%5d",n); } system("pause"); 为什么n=g*g*g+s*s*s+b*b*b;一定要写成if(n==g*g*g+s*s*s+b*b*b)才正确? 解决方案 n=g*

C语言经典算法例题求100-999之间的“水仙花数_C 语言

题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方. 实现代码如下 #include <iostream> #include <Cmath> using namespace std; /* 求100-999之间的水仙花数 */ int main() { int number,hun,ten

java计算自然数中的水仙花数的方法分享_java

复制代码 代码如下: /** * m-n自然数中的水仙花数 * @param n * @param m */static void getNums(int n,int m){for(int i=m;i<=n;i++){int ge,shi,bai;double shui;bai=i/100;shi=i%100/10;ge=i%10;shui=Math.pow(bai, 3)+Math.pow(shi, 3)+Math.pow(ge, 3);if(i==shui)System.out.printl

PHP求小于1000的所有水仙花数的代码_php技巧

水仙花数是一个n(>=3)位数字的数, 它等于每个数字的n次幂之和. 例如, 153是一个水仙花数, 153=1³+5³+3³. 编写程序, 求解小于1000的所有水仙花数. 复制代码 代码如下: <?php for($i=100;$i<1000;$i++){ $a=intval($i/100); $b=intval($i/10)%10; $c=$i%10; if(pow($a,3)+pow($b,3)+pow($c,3)==$i){ echo $i."\t"; }

水仙花数的vfp实现

水仙花数的实现是一个比较经典的算法题,今天我们首先在vfp中来实现它. 首先我们了解一下什么是"水仙花数".所谓水仙花数是指一个n位数,其各位数字立方和等于该数本身的值,例如:153=13+53+33 ,所以153是一个水仙花数. 我们来做一个简单点儿的:求解3位数的水仙花数,即100至999之间的水仙花数.很明显这个程序需要使用循环,并且从水仙花数的概念可知,其重点是求解出循环变量当前值的各位数字的值.剩下的工作就简单了,把求解出的各位数字的立方和与循环变量当前值进行比较,如果相等则

请问这段水仙花数程序有什么问题

问题描述 请问这段水仙花数程序有什么问题 #includevoid main(){ int a b de=0; for (a = 1:;a++) { do { b = a % 10; d = a / 10; e = e + b*b*b; a = d; } while (d != 0); if (a==e) printf("" %dn""e); }}大神求解答诊断程序在VS2013中没有警告或错误,但是执行时弹出框只是光标在闪烁,没有其他任何数字或字母请问这段程序有什