📅  最后修改于: 2023-12-03 15:19:37.440000             🧑  作者: Mango
在程序中,经常需要查询一个数组中指定范围内素数的总和。这种需求可以使用以下方法来实现:
实现过程中,可以考虑以下两种方法:
暴力枚举的思路比较简单,直接遍历指定范围内的所有数字,对于每个数字都用素数判断方法来判断是否是素数,如果是素数则累加到总和中。这种方法的时间复杂度为 $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])