📅  最后修改于: 2023-12-03 14:59:08.070000             🧑  作者: Mango
计数质数是一个经典的数论问题。题目要求我们统计在区间 [L, R] 中所有满足条件的数的个数,即直到这个数本身是质数的过程中,所有的数都是质数。
常规的解法是暴力枚举,在区间 [L, R] 中遍历每一个数,统计是否满足条件。但是这种做法会超时,时间复杂度为 $O(R-L+1)\sqrt{R}$。
有一种高效的算法叫做埃氏筛法,可以快速地筛选出所有的质数,并用于计数。它的时间复杂度为 $O(R \log \log R)$。
具体思路是建立一个长度为 $R+1$ 的标记数组 $isPrime$,先将数组中的所有元素置为 $true$,然后从 $2$ 开始枚举,若当前数 $i$ 是质数,将它的倍数($2i$,$3i$,$4i$,...)标记为不是质数,直到 $i^2 > R$ 为止。
经过这个过程后,数组中仍为 $true$ 的位置就是质数。最后只需要再统计区间 [L, R] 中所有的质数个数即可。
以下是 Python3 实现的代码:
def countPrimes(L: int, R: int) -> int:
# 初始化标记数组
isPrime = [True] * (R + 1)
i = 2
while i * i <= R:
if isPrime[i]:
# 将 i 的倍数标记为非质数
j = i * i
while j <= R:
isPrime[j] = False
j += i
i += 1
# 统计质数的个数
cnt = 0
for i in range(max(L, 2), R + 1):
if isPrime[i]:
cnt += 1
return cnt
计数质数是一个经典的数论问题,在实际应用中也有很多场景。此处介绍了一种高效的算法——埃氏筛法,它的时间复杂度为 $O(R \log \log R)$。在实际应用中,如果需要多次调用该算法,可以考虑使用线性筛法,时间复杂度为 $O(R)$。