素数是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除的数。例如,2、3、5、7、11等都是素数。
素数和的计数问题通常指的是计算在一定范围内所有素数的和,或者是计算某个特定数列中素数的个数。
解决方法:使用埃拉托斯特尼筛法(Sieve of Eratosthenes)。该算法通过标记合数来找到素数,时间复杂度为O(n log log n)。
def sieve_of_eratosthenes(n):
is_prime = [True] * (n + 1)
p = 2
while p * p <= n:
if is_prime[p]:
for i in range(p * p, n + 1, p):
is_prime[i] = False
p += 1
primes = [p for p in range(2, n + 1) if is_prime[p]]
return primes
# 示例
primes = sieve_of_eratosthenes(30)
print(primes) # 输出: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
解决方法:在找到素数后,直接求和即可。
def sum_of_primes(n):
primes = sieve_of_eratosthenes(n)
return sum(primes)
# 示例
sum_primes = sum_of_primes(30)
print(sum_primes) # 输出: 129
解决方法:使用线性筛法(Linear Sieve),也称为欧拉筛法(Euler's Sieve)。该算法的时间复杂度为O(n)。
def linear_sieve(n):
is_prime = [True] * (n + 1)
primes = []
for i in range(2, n + 1):
if is_prime[i]:
primes.append(i)
for prime in primes:
if i * prime > n:
break
is_prime[i * prime] = False
if i % prime == 0:
break
return primes
# 示例
primes = linear_sieve(30)
print(len(primes)) # 输出: 10
通过以上方法,可以高效地解决素数和的计数问题,并应用于各种实际场景中。
领取专属 10元无门槛券
手把手带您无忧上云