统计所有小于非负整数 n
的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
提示:
0 <= n <= 5 * 10^6
通过次数92,096
提交次数253,83
思路:不建议采用暴力法,可以采用筛选排除法,先使用一个O(n)的数组来存储该数是否为质数,初始化为true,筛选之后可以将不是质数的改为false,最后数组中为true的就都是质数,且一个不少。并不需要对的每一个数进行筛选,只需要对进行筛选,即可筛出所有不是质数的数。
class Solution {
public int countPrimes(int n) {
boolean[] isPrime=new boolean[n];
int result=0;
for(int i=2;i<n;i++){
isPrime[i]=true; //先初始化为true
}
for(int i=2;i*i<n;i++) { //找出所有不是素数的数
if(!isPrime[i]) {//已经被找出的不用再管
continue;
}
else{
for(int j=i*i;j<n;j+=i){
//由于i是质数, 那么i^2、i^2+i、i^2+2i一定不是质数,也一定不是素数
isPrime[j]=false;
}
}
} //所有不是质数的数已经全部筛掉
//计算剩余的质数个数
for (int i=2;i<n;i++){
if (isPrime[i]==true){
result++;
}
}
return result;
}
}