LeetCode算法题204:计数质数解析
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
寻找质数这种题的最简单的解法就是依照定义,遍历每一个数,然后从2开始到其本身减1,看是否能被中间的数整除,能则不是质数。但是这样的解法时间复杂度太高。有一种方法叫埃拉托斯特尼筛法,简称埃氏筛,也称素数筛。这是一种简单且历史悠久的筛法,用来找出一定范围内所有的素数。计算过程是:给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。如图所示:
所以程序如下:
C++源代码:
class Solution {
public:
int countPrimes(int n) {
if (n < 2) return 0;
vector<bool> map(n, true);
map[1] = map[0] = false;
int all = 0;
int k = sqrt(n)+1;
for(int i=2;i<k;i++)
{
if(map[i])
{
for (int j=i*i;j<n;j+=i)
map[j] = false;
}
}
for (int i=2;i<n;i++)
if (map[i]) all++;
return all;
}
};
python3源代码:
class Solution:
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n < 2:
return 0
l = [1] * n
l[1] = l[0] = 0
allPrimes = 0
limit = int(math.sqrt(n)) + 1
for i in range(2, limit):
if l[i]:
for j in range(i*i, n, i):
l[j] = 0
return sum(l)