暴力法简单实时超时,第二种埃式筛比较巧妙。
初始化长度 O(n)的标记数组,表示这个数组是否为质数。数组初始化所有的数都是质数. 从 2 开始将当前数字的倍数全都标记为合数。标记到根号n时停止即可。
class Solution {
//暴力法
public int countPrimes(int n) {
if(n<2) return 0;
int res = 0;
for(int i=2;i<n;i++){
res+= isPrime(i)?1:0;
}
return res;
}
public boolean isPrime(int x){
for(int i=2;i*i<=x;i++){
if(x % i==0) return false;
}
return true;
}
//埃式筛
public int countPrimes(int n) {
if(n<2) return 0;
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime,true);
for(int i=2;i*i<n;i++){
if(isPrime[i]){
for(int j=i*i;j<n;j+=i){
isPrime[j] = false;
}
}
}
int res = 0;
for(int i=2;i<n;i++){
res+=isPrime[i]?1:0;
}
return res;
}
}