100の内の素質を求めてそして出力します

8343 ワード

初めての面接問題の問題があったので、今日はたまたま整理してみました.
その時最も基本的なアルゴリズムを使って書いて、2つのfor循環、1つ1つ余剰を取って、質数は結果の配列の中に入れます
コードは以下のように,コード実行時間をチェックするコードは,3つの異なるアルゴリズムの優劣性を比較するために用いられる.
アルゴリズム1:それぞれの数はすべて2から除いて、すべての自分より小さい整数を除いて、もし整除することができることがあるならば、説明は質数ではありませんて、今回の循環を脱退して、次の循環を行います
function test()
{
    $start = microtime(true);  //      
    //     true !!!
    //     true !!!
    //     true !!!
    $array = array();   //    
    for ($i=2; $i < 40001; $i++) { 
       $mark = 0;       //         0  , 1     
       for ($j=2; $j < $i; $j++) { 
           if(($i % $j) === 0)
           {
                $mark = 1;  //            ,       
                break;
           }
       }

       if($mark != 1)
       {
        $array[] = $i;  //    
       }

    }

    echo "
";
    print_r($array);
    echo "
"; echo microtime(true)-$start; }

 
は てアルゴリズムを させてくれました.その 、 のコードはbreakさえなかったようです.それからbreakを して、 に を ていました.
ははは、そして の を することができます~
しかし、 の はまだよくて、 に より1 さい を く はありませんと えてくれました. の の は を いて です.
そして は、この の を けばいいと って、 えば17から4を けばいいです. が を えた 、 と の を さまにしただけで、 り しだからです.
アルゴリズム2:2 のforサイクルの$iをsqrt($i)に き える はほとんど しない
function test1()
{
    $start = microtime(true);
    $array = array();
    for ($i=2; $i < 40001; $i++) { 
       $mark = 0;
       for ($j=2; $j <= sqrt($i); $j++) { 
           if(($i % $j) === 0)
           {
                $mark = 1;
                break;
           }
       }

       if($mark != 1)
       {
        $array[] = $i;
       }

    }

    // echo "
";
    // print_r($array);
echo "";
echo microtime(true)-$start;
}
もちろんもう つのアルゴリズムがありますが、 は ですか? は ですか. 
とは、 と1 は も けることができず、 が であり、 は ず に じて ることができる.
このルールにより、$iが より さい を できるかどうかを べるだけで、 を てることができます.(この の はアルゴリズム2ほど くない)
アルゴリズム2と み わせて、$i より さい だけを べることもできます(この の はアルゴリズム2よりも くなります)
アルゴリズム3:このアルゴリズムは が も い
function test2()
{
    $start = microtime(true);
    $queue = array();   //          ,            , 
    $queue[] = 2;
    for ($i=2; $i < 40001; $i++) { 
        $mark = 0;
        foreach ($queue as $key => $value) {

            //    $i       
            if($value >= sqrt($i))
            {
                break;
            }

           //foreach    ,            ,    $i    ,         
           if(($i % $value)  === 0)
           {
                $mark = 1;   
                break;   
           }
       }

       if($mark != 1)
       {
            $queue[] = $i;  //  $i   ,        ,         
       }

    }

    // echo "
";
    // print_r($queue);
echo "";
echo microtime(true)-$start;
}
 
に できます
test();
test1();
test2();

とコードの を します. に に じてコメントを いたり じたりしてください.
:https://www.cnblogs.com/lz0925/p/9184001.html