f方法一:最简单的方法从3到sqrt(N)遍历
方法二:如果一个数不被X从3到sqrt(X)中的素数整除,则也是素数,所以需要保存一个素数数组
public class Solution {
public int countPrimes(int n) {
int count=0;
if(n<=2){
return count;
}
List<Integer> l =new ArrayList<Integer>();
l.add(2);
count++;
for(int i=3;i<n;i++){
if(IsPrime(i,l)){
count++;
}
}
return count;
}
public boolean IsPrime(int x,List<Integer> l){
for(int i=0;i<l.size();i++){
int temp=(int)Math.sqrt(x);
if(l.get(i)>temp){
break;
}
if(x%l.get(i)==0){
return false;
}
}
l.add(x);
return true;
}
}
方法三:从I=2开始到把 i 的倍数都标记,注意也是倍数也是小于sqrt(N),最后没被标记的就是素数
public class Solution {
public int countPrimes(int n) {
int count=0;
if(n<=2){
return count;
}
boolean[] is=new boolean[n];
for(int i=2;i*i<n;i++){
if(!is[i]){
for(int j=i;i*j<n;j++){
is[i*j]=true;
}
}
}
for(int i=2;i<n;i++){
if(!is[i]){
count++;
}
}
return count;
}
}