Python中1到N之间所有素数的总和

时间:2018-12-27 03:58:27

标签: python python-3.x

我是编程新手。在尝试解决此问题时,我得到了错误的答案。我检查了我的代码多次,但无法找出错误。请帮我解决这个简单的问题。问题如下:

  

给出一个正整数 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。请找出我的代码中的错误。

6 个答案:

答案 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)