【问题标题】:Python Prime Number for-else rangePython Prime Number for-else 范围
【发布时间】:2018-11-20 19:22:11
【问题描述】:
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 所以应该跳过它...

【问题讨论】:

  • i 为 3 时会发生什么?
  • for i in range(2,num) 如果 num 是 2 那是 empy 列表,所以你不会得到 2%2==0
  • 嗯.... 2 是质数。它只能由它自己和一个来划分。但是,我确实在您的代码中看到了导致意外响应的错误:range(start,end) 需要 end 大于 start。 Python 的鸭子类型意味着不会执行检查,并且您的 if 语句不会被检查。我希望python没有那样做,但不幸的是它做到了。

标签: python python-3.x algorithm primes


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2022-12-16
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多