统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
1. 看到这道题的时候,第一反应是用遍历。
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
def isPrimes(n):
if n == 1:
return bool(0)
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return bool(0)
return bool(1)
count = 0
for i in range(1, n):
if isPrimes(i):
count += 1
return count
2. 查了一下,发现一个十分炫酷的方法:厄拉多塞筛法,具体讲解可以参考这个博客:https://blog.csdn.net/github_39261590/article/details/73864039
大致意思就是从2开始,将1~n中2的倍数都划掉,只留最开始的一个2;接下来是未做处理的3,将3的倍数都划掉,只留下一个3;类似的这样下去。。。直到所有的数字都被处理过(留下或者划掉),最终留下的数字是n以内的质数。
对于这道题,可以不需要知道具体的质数是谁,所以只需要用逻辑01计数即可.
def countPrimes(self, n):
if n < 3:
return 0
primes = [1] * n # 广播
primes[0] = primes[1] = 0
for i in range(2, int(n ** 0.5) + 1):
if primes[i]:
primes[i * i: n: i] = [0] * len(primes[i * i: n: i]) # i*i到n之间隔i取一次数
return sum(primes)