統計質數

原題

  Description:
  Count the number of prime numbers less than a non-negative number, n.html

題目大意

  統計小於非負整數n的素數的個數。算法

解題思路

  使用見埃拉托色尼篩法。less

埃拉托色尼篩法,是一種公元前250年由古希臘數學家埃拉托色尼所提出的一種簡單檢定素數的算法。url

給出要篩數值的範圍n,找出埃拉托色尼篩法之內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下一個素數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下一個素數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......。spa

 

舉例:求25之內的全部素數.net

(1) 列出2之後的全部序列:code

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25htm

(2) 標出序列中的第一個素數,也就是2,劃去2的倍數(用紅色標出)序列變成:blog

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25ip

(3) 若是如今這個序列中最大數小於最後一個標出的素數的平方,那麼剩下的序列中全部的數都是素數,不然回到第二步。本例中,由於25大於2的平方,咱們返回第二步:

(4) 剩下的序列中第一個素數是3,再將主序列中3的倍數劃出(紅色),主序列變成:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

(5) 咱們標出的素數有:2,3,當前25仍然大於3的平方,因此咱們還要返回第二步:

如今序列中第一個素數是5,一樣將序列中5的倍數劃出,主序列成了:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

(6) 由於25等於5的平方,跳出循環.

結論:去掉紅色的數字,2到25之間的素數是:2 3 5 7 11 13 17 19 23

 

下圖中:

2是第一個標出的素數爲紅色,2的倍數爲淺紅色

3是第二個標出的素數爲綠色,3的倍數爲淺綠色

5是第三個標出的素數爲藍色,5的倍數爲淺藍色

2,3,5,加上剩餘的灰色數字就是所求的素數

 

埃拉托色尼篩法

代碼實現

算法實現類

public class Solution {

    public int countPrimes(int n) {

        if (n <= 1) {
            return 0;
        }

        // 默認全部的元素值都會設置爲false
        boolean[] notPrime = new boolean[n];
        notPrime[0] = true;
        notPrime[1] = true;

        for (int i = 2; i * i < n; i++) {
            // 若是i是一個質數,i將i的倍數設置爲非質數
            // 如是i是一個合數,則它一定已經設置爲true了,由於是從2開始處理的
            if (!notPrime[i]) {
                for (int j = 2 * i; j < n; j += i) {
                    notPrime[j] = true;
                }
            }
        }

        // 統計質數的個數
        int result = 0;
        for (boolean b : notPrime) {
            if (!b) {
                result++;
            }
        }

        return result;
    }
}
相關文章
相關標籤/搜索