204. 计数质数

题目

统计所有小于非负整数 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;
    }
}
原文地址:https://www.cnblogs.com/bendandedaima/p/13398476.html