Python 质数 for-else 范围

Python Prime Number for-else range

lower = int(input("from:"))
upper = int(input("to:"))
for num in range(lower,upper + 1):
   if num > 1:
       for i in range(2,num):
           if (num % i) == 0:
               break
       else:
           print(num)

为什么这段代码将“2”打印为素数? (它是但它不应该打印它)

2%2==0 所以它应该跳过它...

num为2时,range(2, num)为空,所以不进行if (num % i) == 0:校验,执行else块。

其他人注意到 range(start,end) 代码中的错误。更正这一点,您的素数代码可以重写为:

lower = int(input("from:"))
upper = int(input("to:"))
for num in range(lower,upper + 1):
   if num > 1:
       for i in range(2,max(num,3)):
           if (num % i) == 0:
               break
       else:
           print(num)

请注意,这不是获得质数的最快方法,每个潜在的质数都必须针对每个较小的数作为可能的除数进行测试。相反,向上计数并计算较小数字的倍数要快得多。这样我们只需要为每个可能的除数计算一次。

为了完整起见,这里有一个程序可以有效地产生素数(使用埃拉托色尼筛法)。

#### INPUTS    
lower = int(input("from:"))
upper = int(input("to:"))

### Code
n = upper
prime_booleans = [True for i in range(n+1)] 
p = 2
while (p * p <= n): 

    # Is current number a prime, eliminate the numbers that are multiples of it 
    if (prime_booleans[p] == True): 
        for i in range(p * 2, n+1, p): 
            prime_booleans[i] = False
    p += 1

# Print all prime numbers 
for p in range(lower, n): 
    if prime_booleans[p]: 
        print p,