【问题标题】:Python Prime Number Generator Prints 4Python 素数生成器打印 4
【发布时间】:2020-11-19 09:18:24
【问题描述】:

我有一个学校练习,我必须制作一个质数生成器并稍后对其进行优化。 在我做了一些优化之后,我的生成器也开始打印数字“4”,这显然不是质数。

我的代码如下所示:

import time
#Primzahlen errechnen
c = 0
print("Enter Upper Value:")
Max_wert = input()
x = int(Max_wert)

print("Prime Numbers between 0 and ", x, "are:")
time.sleep(1) # Pause für 2 Sekunden

for num in range(2, x):
    num2 = int(num / 2)
    for i in range(2, num2):
        if (num % i) <= 0:
            break
    else:   
        print(num)
        c+=1

print(c, "Prime Numbers were found")

当我删除行:&gt; num2 = int(num / 2) 并将 for 循环中的 num2 更改回 num 时,一切正常。

【问题讨论】:

  • 如果您的 num 为 4,则您的 range(2, num2) 为空,因此找不到因子。使用更大的范围。
  • thx,我找到了防止“num”永远为 4 的解决方案。我将第一个 for 循环编辑为:“range(1, x+1, 2)” 所以它跳过每个偶数(显然包括 4)。
  • 您可以使用num2 = num//2 + 1 作为您的上限(尽管通常会涉及平方根)。
  • 这两种解决方案都适用,但问题是 2 现在也被跳过了,iirc 2 也是一个素数

标签: python for-loop generator primes


【解决方案1】:

问题在于,在 for 循环中,您必须从 2 测试到 floor(sqrt(num)) 而不是 num/2(任何进一步的控制都是无用的,请查看:Why do we check up to the square root of a prime number to determine if it is prime?,最重要的是,i 的范围必须在range(2, num2 + 1)range(2, num2) 之间

for 循环代码将是:

for num in range(2, x):
    num2 = math.floor(math.sqrt(num))
    for i in range(2, num2 + 1):
        if (num % i) <= 0:
            break
    else:   
        print(num)
        c+=1

一个示例输出将是:

Enter Upper Value:
10
Prime Numbers between 0 and  10 are:
2
3
5
7
4 Prime Numbers were found

【讨论】:

    【解决方案2】:

    在循环中for i in range(2, num2):当num在2到5之间时程序流不会进入for循环。

    所以它们 2,3,4,5 只是被打印出来,而不是因为它们是质数还是非质数。

    因为 num2=int(num/2),所以当 num 在 [2,5] 时,for 循环的范围是 (2,1)(2,1)(2,2)(2,2)。

    当 num=2,3 range(2,1) 没有意义,因为您要求它从 2 开始并一直到 1,因此它退出 for 循环并直接进入 else 块打印 2 AND 3。

    当 num=4,5 range(2,2) 不会给出任何东西,因为你要求它从 2 开始并一直到 2(不包括在内)所以它再次直接进入 else 块打印 4 和 5。

    对于 num 的值,超过 5 个 ur 代码会正常运行。

    所以你的for循环应该是:

    for num in range(2, x):
        num2 = int(num / 2 + 1)
        for i in range(2, num2):
            if (num % i) <= 0:
                break
        else:   
            print(num)
            c+=1
    

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 2021-04-26
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多