一、题目
OJ链接
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 .
二、题解
思路:将1~n-1上不是素数的数全部除去,剩下的数的数量就是素数
- 除了2,所有的偶数都不是素数,因为4=2x2;6=2x3;8=2x4…
- 在去除掉因子中含有3的所有不是素数的数,
3x2不用再算了,因为计算2x3的时候算过了,所以对于数字i只需从 i x i 开始,3x3=9(不是素数), 3x4不用算(偶数),3x5=15(不是素数)…
public int countPrimes1(int n) {
if(n<3){
return 0;
}
boolean[] f=new boolean[n];
int count =n/2;
for(int i=3;i*i<n;i+=2){
if(f[i]){ //例如i=9时,9在3*3的时候就判断过9不是素数,就已经
//将f[9]=true,而之所以可以跳过9是因为,9*9=3*3*9,
//9*11=3*3*11,就说明,含有9这个因子且不是素数的数,在
//去除以3作为因子所有不是素数的数的时候已经算过了
continue;
}
for(int j=i*i;j<n;j+=2*i){
if(!f[j]){
count--;
f[j]=true;
}
}
}
return count;
}