我是编程新手。在尝试解决此问题时,我得到了错误的答案。我检查了我的代码多次,但无法找出错误。请帮我解决这个简单的问题。问题如下:
给出一个正整数 N ,计算 1 和 N (含)之间的所有素数之和。输入的第一行包含一个整数 T ,表示测试用例的数量。接下来是 T 测试用例。每个测试用例包含一行包含 N 的输入。对于每个测试用例,在新行中打印 1 和 N 之间的所有素数之和。
我的代码是:
from math import sqrt
sum = 0
test = int(input())
for i in range(test):
max = int(input())
if max==1:
sum = 0
elif max==2:
sum += 2
else:
sum = sum + 2
for x in range(3,max+1):
half = int(sqrt(max)) + 1
for y in range(2,half):
res = x%y
if res==0:
sum = sum + x
break
print(sum)
对于输入5和10,我的代码分别给出输出6和48,而正确答案分别为10和17。请找出我的代码中的错误。
答案 0 :(得分:2)
首先,在for i循环的开头声明sum为零。
我认为问题在于代码的几乎结尾处的if语句,如果res等于零,则将x加到总和上,这意味着数字确实不是质数。您可以看到是这种情况,因为输入5时输出为6,因为范围1到5之间(包括5)的唯一质数是4,并且已经在开头加了2。
最后但并非最不重要的是,您应该更改
half = int(sqrt(max)) + 1
行至
half = int(sqrt(x)) + 1
尝试使用提供的我的信息并自己修复代码。不复制别人的代码,您可以学到最多的知识。
编码愉快!
答案 1 :(得分:2)
因为您的逻辑不正确。
for y in range(2,half):
res = x%y
if res==0:
sum = sum + x
break
在这里检查是否存在因数,然后如果存在因数,则求和的结果与质数相反。因此,请检查没有因素的数字(除了1)。
from math import sqrt
test = int(input())
for i in range(test):
sum = 0
max = int(input())
if max==1:
sum = 0
elif max==2:
sum += 2
else:
sum = sum + 2
for x in range(3,max+1):
half = int(sqrt(x)) + 1
if all(x%y!=0 for y in range(2,half)):
sum = sum + x
print(sum)
答案 2 :(得分:2)
对您所拥有的内容进行一些修改:
from math import sqrt
sum = 0
test = int(input())
max = int(input())
for x in range(test,max+1):
if x == 1:
pass
else:
half = int(sqrt(x)) + 1
for y in range(2,half):
res = x%y
if res==0:
break
else:
sum = sum + x
print(sum)
您最大的错误是您在休息前执行sum = sum + x,而不是在else语句中进行。
PS :(尽管可以)我建议您在代码中不要使用变量名,例如max和sum。这些是现在已被覆盖的特殊功能。
答案 3 :(得分:2)
这是代码中最损坏的部分,它的作用与您想要的相反:
res = x%y
if res==0:
sum = sum + x
break
只有在不中断整个循环的情况下,才递增sum
。 (并且,在重新定义Python内置Python时,请勿使用sum
。)可以在else
循环上使用for
的特殊情况来检查这一点,也称为“不间断” ”。我在下面进行了更改,并纠正了一些效率低下的问题:
from math import sqrt
T = int(input())
for _ in range(T):
N = int(input())
sum_of_primes = 0
if N < 2:
pass
elif N == 2:
sum_of_primes = 2
else:
sum_of_primes = 2
for number in range(3, N + 1, 2):
for odd in range(3, int(sqrt(number)) + 1, 2):
if (number % odd) == 0:
break
else: # no break
sum_of_primes += number
print(sum_of_primes)
输出
> python3 test.py
3
5
10
10
17
23
100
>
答案 4 :(得分:1)
我相信您的代码中的错误可能来自以下几行代码:
for x in range(3,max+1):
half = int(sqrt(max)) + 1
由于要使用x进行循环,因此应将int(sqrt(max))更改为int(sqrt(x)),如下所示:
for x in range(3,max+1):
half = int(sqrt(x)) + 1
您的代码试图查看max是否为素数N次,您应该在其中查看1-N中的每个数字是否均为素数。
这是我第一次回答问题,所以如果您需要更多帮助,请告诉我。
答案 5 :(得分:1)
在这里,我实现了一个简单的程序来查找1到n之间所有素数的和。 将primeAddition()作为函数,并将ip作为输入参数。可以帮助您解决问题。尝试一下。
代码段:
def primeAddition(ip):
# list to store prime numbers...
prime = [True] * (ip + 1)
p = 2
while p * p <= ip:
# If prime[p] is not changed, then it is a prime...
if prime[p] == True:
# Update all multiples of p...
i = p * 2
while i <= ip:
prime[i] = False
i += p
p += 1
# Return sum of prime numbers...
sum = 0
for i in range (2, ip + 1):
if(prime[i]):
sum += i
return sum
#The program is ready... Now, time to call the primeAddition() function with any argument... Here I pass 5 as an argument...
#Function call...
print primeAddition(5)