【问题标题】:Sum of all prime numbers between 1 and N in PythonPython中1到N之间所有素数的总和
【发布时间】:2018-12-27 03:58:27
【问题描述】:

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

给定一个正整数N,计算1N(含)之间所有素数的和。输入的第一行包含一个整数T,表示测试用例的数量。 T 测试用例如下。每个测试用例包含一行包含 N 的输入。对于每个测试用例,在新行中打印 1N 之间所有素数的总和。

我的代码是:

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。请找出我的代码中的错误。

【问题讨论】:

标签: python python-3.x


【解决方案1】:

在这里,我实现了一个简单的程序来查找 1 到 n 之间的所有素数之和。 将 primeAddition() 视为函数,将 ip 视为输入参数。它可能会帮助您解决问题。试试吧。

代码sn-p:

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)

【讨论】:

  • 很有帮助,我敢肯定,但 OP 明确表示“但是,我想知道我的代码中的错误。”
【解决方案2】:

这是您的代码中最糟糕的部分,它与您想要的相反:

res = x%y
if res==0:
    sum = sum + x
    break

如果你通过整个循环而不中断,你只会增加sum。 (并且不要使用sum,因为您正在重新定义Python 内置。)这可以使用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
>

【讨论】:

    【解决方案3】:

    对您的内容稍作修改:

    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)    
    

    您最大的错误是您在 break 之前而不是在 else 语句中执行 sum = sum + x。

    PS:(虽然你可以)我建议不要在你的代码中使用像 max 和 sum 这样的变量名。这些是现在被覆盖的特殊函数。

    【讨论】:

    • 这不适用于test 变量,它是读取max 变量并运行代码的次数。 IE。你错过了外循环。
    • 我应该澄清一下。这是为了找到 test 和 max 之间的素数和
    【解决方案4】:

    因为你的逻辑不正确。

    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)     
    

    【讨论】:

      【解决方案5】:

      首先,在 for i 循环开始时声明 sum 为零。

      问题在于几乎在代码末尾的 if 语句,当您将 x 添加到总和时,如果 res 等于 0,则意味着该数字确实不是质数。您可以看到情况确实如此,因为输入 5 时会得到 6 的输出,因为在 1 到 5(包括 5)范围内唯一的非质数是 4,并且您已经在开始的总和中添加了 2。

      最后但同样重要的是,你应该改变

      half = int(sqrt(max)) + 1
      

      行到

      half = int(sqrt(x)) + 1
      

      尝试使用我提供的信息并自己修复代码。通过不复制他人的代码,您可以学到最多的东西。

      编码愉快!

      【讨论】:

        【解决方案6】:

        我认为您的代码中的错误可能来自以下代码行:

        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 中的每个数字是否都是素数。

        这是我第一次回答问题,如果您需要更多帮助,请告诉我。

        【讨论】:

        • 您建议的代码更改是必要的,但不足以修复 OP 的程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2020-10-02
        • 2018-10-09
        • 1970-01-01
        • 2021-03-19
        • 2013-05-11
        相关资源
        最近更新 更多