解法
一个计算[1,n)
区间内质数数量的算法
- 首先,如果p是质数,那么p的所有倍数都要被mark成非质数,到
p*i>=n
为止 - 如果某个数为
p*q
,但是q<p
,那么这个数一定在之前被标记过,被q
里的质因子标记了 - 所以对质数
p
的标记从k=p*p
开始,到k>n
结束 - 对于区间
[sqrt(n),n)
这里面的非质数来说,它们肯定有小于sqrt(n)
的质因子,所以当我们遍历完[1,sqrt(n))
之后,区间[sqrt(n),n)
里的非质数也被标记完成了 - 最后只需要重新遍历一遍
[1,n)
,记录质数个数即可
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
invalid = set()
for i in xrange(2,int(n**0.5)+1):
if i not in invalid:
for j in xrange(i**2,n,i):
invalid.add(j)
return len(filter(lambda x:x not in invalid, xrange(2,n)))