import math
T=int(input())
s=0
for i in range(T):
m,n=map(int,input().split())#T组数据放入循环之中
for j in range(m,n+1):#遍历m到n的各个数方便检验是否为素数
for k in range(2,int(math.sqrt(n))+1):#从2开始到根号n遍历看是否有其他因子
if j%k!=0:#m到n中的某个数j没有其他因子
s+=j#将这个素数j加起来
print(s)#输出素数和
break
import math
T = int(input())
for i in range(T):
m,n=map(int,input().split())
s = 0
for j in range(max(2, m), n+1):
v = 1
for k in range(2,int(math.sqrt(j))+1):
if j % k == 0:
v = 0
break
if v == 1:
s += j
print(s)
不知道你这个问题是否已经解决, 如果还没有解决的话:这道题的关键是熟悉字典的操作方法。
我会给出两种解决方案。第一种方案利用之前的思路做了些许修改,第二种方案则利用埃拉托斯特尼筛法实现素数筛选。
方案一: 在你之前的代码中,有一个错误,就是循环的范围应该是从2~该数的平方根+1,而不是从2~该数-1。因为质数的定义是只能被1和本身整除,所以当一个数不能被2~该数的平方根+1之间任意一个数整除时,这个数才是素数。以下是修改后的代码:
import math
def prime_sum(n):
result = 0
for num in range(2, n + 1): # 遍历2~n的所有自然数
for i in range(2, int(math.sqrt(num)) + 1): # 判断该数是否为素数
if num % i == 0: # 能被整除,不是素数
break
else: # 不能被整除,是素数
result += num
return result
方案二: 利用埃拉托斯特尼筛法实现素数筛选。首先,我们先生成一个包含范围内所有自然数的列表,然后从2开始,将其所有的倍数从列表中删除,最后剩余的所有数即为素数。以下是代码实现:
def prime_sum(n):
nums = list(range(2, n + 1)) # 生成所有自然数列表
primes = [] # 保存素数的列表
while nums:
prime = nums.pop(0) # 第一个数一定是素数
primes.append(prime)
nums = [num for num in nums if num % prime != 0] # 将该素数的所有倍数从列表中删除
return sum(primes)