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

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

主题:查询给定数组中 [L, R] 范围内素数总和

在程序中,经常需要查询一个数组中指定范围内素数的总和。这种需求可以使用以下方法来实现:

  1. 遍历指定范围内的所有数字;
  2. 对于每个数字判断其是否是素数;
  3. 如果是素数,则累加到总和中;
  4. 最后返回总和值。

实现过程中,可以考虑以下两种方法:

方法一:暴力枚举

暴力枚举的思路比较简单,直接遍历指定范围内的所有数字,对于每个数字都用素数判断方法来判断是否是素数,如果是素数则累加到总和中。这种方法的时间复杂度为 $O(n^2)$ ,在数据范围较大时不太适用。

方法二:筛法求素数

筛法求素数,可以使用埃氏筛法或欧拉筛法等算法。其中,欧拉筛法的时间复杂度为 $O(n\log{\log{n}})$。这种方法先将数字分为质数和合数两部分,然后将合数筛掉,最后得到的就是质数。在计算素数总和时,可以先使用欧拉筛法求出指定范围内的所有素数,然后计算素数的总和。这种方法适用于在多次查询中查询素数总和的场景。

示例代码(使用欧拉筛法):

def get_primes(n):
    """
    欧拉筛法求素数
    """
    is_prime = [True] * (n+1)
    primes = []
    for i in range(2, n+1):
        if is_prime[i]:
            primes.append(i)
        for p in primes:
            if p*i > n:
                break
            is_prime[p*i] = False
            if i%p == 0:
                break
    return primes


def sum_of_primes_in_range(arr, l, r):
    """
    查询 arr 数组中 [l, r] 范围内素数总和
    """
    primes = set(get_primes(r))
    primes = primes.intersection(set(get_primes(l-1)))
    return sum([num for num in arr[l-1:r] if num in primes])

该段代码使用了欧拉筛法求出 [1, R] 范围内的所有素数,并将其集合与 [1, L-1] 范围内的所有素数取交集,得到 [L, R] 范围内的所有素数。最后只需要遍历 [L, R] 范围内的数字,如果是素数则累加到总和中。

返回代码片段:

### 主题:查询给定数组中 [L, R] 范围内素数总和

在程序中,经常需要查询一个数组中指定范围内素数的总和。下面是两种常用的方法:

#### 方法一:暴力枚举

暴力枚举的思路比较简单,直接遍历指定范围内的所有数字,对于每个数字都用素数判断方法来判断是否是素数,如果是素数则累加到总和中。这种方法的时间复杂度为 $O(n^2)$ ,在数据范围较大时不太适用。

#### 方法二:筛法求素数

筛法求素数,可以使用埃氏筛法或欧拉筛法等算法。其中,欧拉筛法的时间复杂度为 $O(n\log{\log{n}})$。这种方法先将数字分为质数和合数两部分,然后将合数筛掉,最后得到的就是质数。在计算素数总和时,可以先使用欧拉筛法求出指定范围内的所有素数,然后计算素数的总和。这种方法适用于在多次查询中查询素数总和的场景。

示例代码(使用欧拉筛法):

```python
def get_primes(n):
    """
    欧拉筛法求素数
    """
    is_prime = [True] * (n+1)
    primes = []
    for i in range(2, n+1):
        if is_prime[i]:
            primes.append(i)
        for p in primes:
            if p*i > n:
                break
            is_prime[p*i] = False
            if i%p == 0:
                break
    return primes


def sum_of_primes_in_range(arr, l, r):
    """
    查询 arr 数组中 [l, r] 范围内素数总和
    """
    primes = set(get_primes(r))
    primes = primes.intersection(set(get_primes(l-1)))
    return sum([num for num in arr[l-1:r] if num in primes])