Python Prime Number for-else范围

时间:2018-11-20 19:22:12

标签: python python-3.x algorithm primes

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,所以应该跳过它...

2 个答案:

答案 0 :(得分:2)

num为2时,range(2, num)为空,因此不执行if (num % i) == 0:检查,并且执行else块。

答案 1 :(得分:1)

其他人注意到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)

这不是让素数引起您注意的最快方法,每个潜在素数都必须针对每个较小的数进行除数检验。取而代之的是向上计数并计算出较小数字的倍数要快得多。这样,我们只需要对每个可能的除数进行一次数学运算即可。

为了完整起见,这是一个可以有效产生素数的程序(使用Eratosthenes方法的筛子)。

#### 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,