📌  相关文章
📜  Q 查询的给定数组中 [L, R] 范围内的素数总和(1)

📅  最后修改于: 2023-12-03 15:34:33.427000             🧑  作者: Mango

求给定范围内素数总和

介绍

在计算机编程中,经常需要计算一个给定范围内的素数总和。例如,在一些统计学分析中,需要求出一段时间内素数的数量和大小,以便进行进一步的分析和推断。

对于初学者来说,计算给定范围内素数总和是一个典型问题,但是如果没有合适的算法和工具,这个问题会变得非常困难。本文将介绍一种常用的算法和工具,帮助程序员解决这个问题。

算法

常见的素数计算算法有两种:暴力枚举法和埃氏筛法。

暴力枚举法

该方法的原理很简单:从给定的范围内枚举每个数字,并判断是否为素数。如果是素数则加入结果集合,最终返回结果集合中数字的总和。

暴力枚举法的时间复杂度为 $O(n\sqrt{n})$,其中 $n$ 为范围内数字个数。这个方法的优点是简单易懂,但不适用于大范围的计算。

埃氏筛法

埃氏筛法的思路是利用质数的性质:如果一个数是质数,那么它的倍数都不是质数。利用这个性质,在给定范围内,先筛掉所有的偶数,再从 $3$ 开始,将 $3$ 的倍数、$5$ 的倍数、$7$ 的倍数……直到不超过 $\sqrt{R}$ 的数全部筛掉,留下的数即为质数,再求和即可。

埃氏筛法的时间复杂度为 $O(n\log{\log{n}})$,其中 $n$ 为范围内数字个数。这个方法显然优于暴力枚举法,并且适用于较大范围的计算。

代码片段

下面是一个 Python 代码片段,实现了埃氏筛法进行素数求和。该代码片段接受输入一个数组和查询范围 $[L, R]$,并返回 $[L, R]$ 范围内的素数总和。

def primes_in_range(L, R, arr):
    is_prime = [True] * (R + 1)
    primes = []
    p_sum = 0

    # Sieve of Eratosthenes
    for i in range(2, int(R ** 0.5) + 1):
        if is_prime[i]:
            for j in range(i*i, R+1, i):
                is_prime[j] = False

    # Collect primes in range
    for i in range(2, R+1):
        if is_prime[i]:
            primes.append(i)

    # Sum primes in range
    for p in primes:
        if p >= L:
            p_sum += p

    return p_sum
结论

本文介绍了计算给定范围内素数总和的两种算法,分别是暴力枚举法和埃氏筛法。在实际编程中,应当根据要求和数据范围选择合适的算法。对于较大范围的计算,建议采用埃氏筛法。