打印一个区间内的质数

Print prime numbers within an interval

此代码是 运行 用于 1-10 间隔,但对于间隔 20-30,它写的是 21 和 27,我无法理解代码中的错误。我不想知道其他代码;我想知道我的代码有什么问题。

start = int(input("Enter the first number of the interval")) #starting of interval
end = int(input("Enter the last number of the interval")). #end of interval

for i in range(start, end+1):
    for x in range (2,end):
        if (i == 0 or i==1):
            break
        elif (i % x != 0):
            print(i)    
            break
        else:
            break

首先,我不确定你是否想要输入后的句点作为结束。此外,您的代码会检查 i 是否不能被 x 整除,然后打印。因此,例如,您的代码检查 21 是否可以被 2 整除。它不是,因此您的代码将其打印出来并中断。

for x in range (2,end):
    if (i == 0 or i==1):
        break
    elif (i % x != 0):
        print(i)    
        break
    else:
        break

这部分代码应该

print a number if it's prime, otherwise break

但事实并非如此。


您注意到您的代码中有什么奇怪的地方吗?我知道,事实上,在每种情况下,在第一次迭代后,内部 for 循环 breaks,重新考虑代码的这方面,它会正常工作。

简介


您的代码有效地测试了一个数字是否为奇数,如果是,它会打印出来。

如果 start 是 1 并且 end 是任何大于 1 的数字,您的代码将打印区间 [1, end].

中每个大于 2 的奇数

它正在打印所有奇数,但并非所有奇数都是质数!


剖析你的代码


让我们考虑 [1, 20] 区间。您的代码输出区间 [1, 20].

中每个大于 2 的奇数

3, 5, 7, 9, 11, 13, 15, 17, 19.

2 是素数,不在此列表中。我们可以通过在外循环中但在内循环之上编写以下内容来解决这个问题:

if i == 2:
    print(i)

现在输出是`

2, 3, 5, 7, 9, 11, 13, 15, 17, 19.

这样更好,但是 9, 15 不是质数。

你的内部循环中带有条件 (i == 0 or i == 1)if 语句不会导致任何问题。让我们通过将其移到内部循环之外(就在上面)来简化内部循环,这样您的代码就变成了

for i in range(start, end+1):
    if (i == 0 or i == 1):
        # 0 and 1 are not prime
        continue
    if (i == 2):
        # 2 is prime 
        print(i)
    for x in range (2,end):
        if (i % x != 0):
            print(i)
            break
        else:
            break

您的问题的潜在罪魁祸首是内部循环,所以让我们专注于此。

  • 每当 i 是偶数时,在内循环的第一次迭代中,我们 有 x = 2。我们知道,如果 i 是偶数,则 i % 2 是 0,因此 i % x != 0False,所以我们转到 else,在这种情况下我们 跳出内部 for 循环。这一切都很好,因为甚至没有 大于 2 的整数是素数!
  • 每当 i 是奇数时,在内循环的第一次迭代中,我们 有 x = 2。我们知道,如果 i 是奇数,则 i % 2 不为 0,所以 i % x != 0True 然后我们打印 i 然后 break 出来 for 循环。

我们从来没有 x = 3x = 4 等等!

上面准确描述了您的代码正在做什么,即忽略偶数并简单地打印出每个奇数。


输出你想要的解决方案


如果我知道你对质数的定义,那会对我有帮助and/or你正试图实现什么算法。但由于我没有这方面的信息,我只能提出一个解决方案。

为了解决你的问题,你需要清楚地记住什么是质数。素数有许多等效的定义(有关定义示例,请参阅 Wikipedia 素数页面)。我选择了一个建议寻找素数的自然算法的定义。无论给出什么素数定义,都可以从数学上证明它等价于此(对于某些人来说,这是他们看到的第一个素数定义!):

An integer i is prime if and only if i > 1 AND for all k in {2, 3, ..., i - 1}, i % k != 0.

换句话说,整数 i 是质数当且仅当 i 严格大于 1,并且对于从 2 到 [=44] 的所有整数 k =], k 不平分 i.

在这里

start = int(input("Enter Start: "))
end = int(input("Enter End: "))

print(f"\nPrime numbers between [{start}, {end}]:")
for i in range(start, end + 1):
    if (i == 0 or i == 1):
        # i is not prime
        continue
    if (i == 2):
        # i is prime
        print(i)
        continue

    for x in range(2, i):
        if (i % x) == 0:
            break

    if (i % x) != 0:
        print(i)

示例会话:

Enter Start: 20
Enter End: 30

Prime numbers between [20, 30]:
23
29

(i == 0 or i == 1) 检查应该放在内部 for 循环之外。否则,对于所有大于或等于 2 的 i,对于内部循环中的每次迭代,您将检查它是否小于 2。你做这个检查太多了。

我们知道当 i == 2i 是素数。

对于i > 2,我们求助于上面素数的定义。

内部循环和最后一个语句应用质数定义的第二部分。