求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;
}