📜  [L,R]中N的所有值的计数,使得直到N的质数也为质数(1)

📅  最后修改于: 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)$。