打印给定数字范围内的质数

Print prime numbers in a range of given numbers

我正在尝试将所有素数打印到给定数字范围内(最小和最大,包括给定数字)。

例如:

num1=10, num2=20

>>> 11, 13, 17, 19

我的代码在某些情况下会失败,我不明白为什么:

num1 = int(input('First number is: '))
num2 = int(input('Second number is: '))
if num2 <= num1:
    num1,num2 = num2,num1
for i in range(num1, num2+1):
    for p in range(2,int(num2**0.5)+1):
        if i%p == 0:
            break
    else:
        print(i,' ',end = '')
print('\n')

结果:

1 to 7 >>> 1 3 5 7 (omits 2)

1 to 30 >>> 1 7 11 13 17 19 23 29 (omits 2,3,5)

1 to 60 >>> 1 7 11 13 17 19 23 29 (omits 2,3,5,7)

0 to 0 >>> 0 (prints 0 -> not a prime number)

0 to 7 >>> 1 3 5 7 (omits 2)

我该如何纠正这个问题?非常感谢!

ps。数字 1 也不是质数。

您的代码中的错误是内部 for 循环范围的第二部分没有 i 而不是 num2

num1 = int(input('First number is: '))
num2 = int(input('Second number is: '))
if num2 > num1: 
    num1, num2 = num2, num1
for i in range(num1, num2+1):
    if i == 0 or i == 1: continue
    for p in range(2,int(i**0.5)+1):     # the second part should be int(i**0.5) + 1, not int(num2**0.5)+1
        if i%p == 0:    
            break       

    else:
        print(i,' ',end = '')

另外,除了 num1 < num2 和相反的两个分支之外,您还可以执行如下操作。进一步在代码设计方面,将其稍微分解为is_prime方法会更好。这样,如果您想编写一个更快的素性测试器,您可以轻松地编辑辅助函数,而不是弄乱主代码。

def is_prime(num):
    if i == 1: return False
    for p in range(2,int(num**0.5)+1):
        if num % p == 0:
            return False
    return True

inp1 = int(input('First number is: '))
inp2 = int(input('Second number is: '))

num1 = min(inp1, inp2)
num2 = max(inp1, inp2)

for i in range(num1, num2+1):
    if is_prime(i):
        print(i,' ',end = '')

print('\n')

你没有考虑除数本身。 即当范围为 1 到 30 时,sqrt(30)+1 = 5+1 = 6,所有小于 6 的数字都被数字本身除以 2%2,3%3 ... i%i .

解决方法是将内部 for 循环的范围更改为:

for i in range(num1, num2+1):
    for p in range(2,int(i**0.5)+1):   #Change num2 to i to avoid i%i
        if i%p == 0:
            break
    else:
        print(i,' ',end = '')

最好像gowrath做的那样对代码进行抽象,以免出错。