ホームページ >バックエンド開発 >PHPチュートリアル >phpを使用して水仙の数を最適化する

phpを使用して水仙の数を最適化する

jacklove
jackloveオリジナル
2018-06-09 11:47:443275ブラウズ

水仙番号は、n 桁の数値 (n>=3) を指し、各桁の数値の n 乗の和はそれ自体に等しく、n はその桁数です。 (例: 1^3 5^3 3^3 = 153)

水仙数はアームストロング数とも呼ばれます。

3 桁の水仙番号が 4 つあります: 153、370、371、407

4 桁の水仙番号が 3 つあります: 1634 、8208、9474

5桁の水仙番号は3つあります: 54748、92727、93084

6桁の水仙番号は1つあります。番号: 548834

水仙の7桁の番号は4つあります: 1741725、4210818、9800817、9926315

8桁の番号があります3 つの水仙番号: 24678050、24678051、88593477

...

最大の水仙番号は 39 桁 (115132219018763992565095597973971522401) で、88 個あります。 10 進自然数における水仙の数。

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(&#39; &#39;, microtime());
    return (float)$usec + (float)$sec;
}
// 设定超时时间为3600秒
set_time_limit(3600);
// 记录开始运行时间
$start = getMicrotime();
// 执行求出3~7位的水仙花数
for($i=3; $i<=7; $i++){
    $result[$i] = implode(&#39;,&#39;, narcissistic($i));
}
// 记录运行结束时间
$end = getMicrotime();
// 输出运行时间
echo &#39;run time:&#39;.(float)($end - $start);
// 打印结果
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r($result);
echo &#39;
'; ?>

実行結果:

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(&#39; &#39;, 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(&#39;,&#39;, narcissistic($i));
}
// 记录运行结束时间
$end = getMicrotime();
// 输出运行时间
echo &#39;run time:&#39;.(float)($end - $start);
// 打印结果
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r($result);
echo &#39;
'; ?>

実行結果:

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 を使用して水仙の数を最適化する方法について説明します。関連コンテンツの詳細については、PHP 中国語 Web サイトを参照してください。

関連する推奨事項:

php を使用して ID 番号を確認する方法

php 経由で YouTube 動画情報を取得する方法

##php unserialize が false を返す問題の解決策について

以上がphpを使用して水仙の数を最適化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。