题目
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
解题思路
采用排除法的思想
1:比2大的偶数一定不是质数
2:从2开始的任意一个数x,x乘一个>=2的整数得到的数字一定不是质数
步骤
1.首先把一半的偶数排除掉count = n/2; 这里并不会把2这个特立给排除,因为1代替了2当质数(或者说1代替2被排除)
2. 排除3 * 3 3 * 5 3 * 7 ..................(为啥从3开始,因为2的倍数的是偶数,在第一步就已经全部排除了)
3. 接着排除5 * 5 5 * 7 ...................
代码
class Solution {
public int countPrimes(int n) {
if(n<=2)
return 0 ;
//①把偶数的排掉——————由思路1知
//count指质数个数
int count = n/2;
//true表示不是质数 , false表示是质数
boolean[] flag = new boolean[n];
//②因为count=n/2已经把偶数给排除掉了,所以这个i=i+2,排除剩下奇数中不是质数的就行
for(int i = 3 ; i<=Math.sqrt(n) ;i+=2){
//已经判断为质数了,continue判断下一个数字
if(flag[i])
continue;
//例如: 3*3 3*5 3*7 ........这些数字肯定不是质数 ————由思路2知
for(int j = i*i;j<n;j+=i*2){
if(!flag[j]){
//不是质数
flag[j]=true;
//排除,质数数量-1
count--;
}
}
}
return count;
}
}