题记:
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
提示:
0 <= n <= 5 * 10^6
题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnzlu6/
来源:力扣(LeetCode)
解题方法:
一:暴力循环方法解决(数据大了会超时)
function countPrimes($n) {
if($n == 1||$n == 0)
return 0;
$count = 0;
$child = [];
for($j = 2; $j <= $n; $j++){
for($i = 1; $i <= $j; $i++){
if($j % $i == 0){
$child[$j][$i] = $i;
}
}
if(count($child[$j]) <= 2){
$count++;
}
}
return $count;
}
二:“埃拉托斯特尼” 筛选法
原理:
function countPrimes($n) {
$count = 0;
$isPrim = array_fill(0,$n,true); //array_fill (isPrim数组 0 到 n 都以 true 填充)
//以下为 “埃拉托斯特尼” 筛选法
for($i=2;$i<$n;$i++){
//为true累加
if($isPrim[$i]){
$count++;
//for为了素数翻倍(变成合数),合数翻倍还是合数,剩下的就真素数
for($j=$i*$i; $j<$n; $j+=$i){
$isPrim[$j] = false;
}
// for($j = $i;$j < $n;$j = $i + $j){
// $isPrim[$j] = false;
// }
}
}
return $count;
}
参考:
作者:如一
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnzlu6/?discussion=qFD1PW
来源:力扣(LeetCode)