求2~2000的所有素数.有足够的内存,要求尽量快

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

埃拉托斯特尼筛法是比较好的解决方法

思路:我们从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。我们需要一个 n-1 长度的 bool 型数组来记录每个数字是否被标记,长度为 n-1 的原因是题目说是小于n的质数个数,并不包括n。

function primeNumber($number)
{
    $arr = [];
    $isPrime = [];

    //默认全部是素数
    for($i = 2; $i < $number; $i++) {
        $isPrime[$i] = true;
    }

    for($i = 2; $i * $i < $number; $i++) {
        if (!$isPrime[$i]) {
            continue;
        }
        for($j = $i * $i; $j < $number; $j += $i) {
            $isPrime[$j] = false;
        }
    }

    for($i = 2; $i < $number; $i++) {
        if($isPrime[$i]) {
            array_push($arr, $i);
        }
    }

    return $arr;
}


posted @ 2020-05-19 10:31  phper-liunian  阅读(394)  评论(0编辑  收藏  举报