1. 程式人生 > 實用技巧 >204. 計數質數

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 * 4 3 * 5 ..................(為啥從3開始,因為2的倍數的是偶數,在第一步就已經全部排除了)
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;
    }
}