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; } }