【问题标题】:Python, prime number checker [duplicate]Python,素数检查器[重复]
【发布时间】:2013-10-23 11:43:21
【问题描述】:

嗨,我正在制作一个函数来检查一个数字是否是素数,但它告诉我 9 是素数。

def eprimo(num):
    if num < 2:
        return False
    if num == 2:
        return True
    else:
        for div in range(2,num):
            if num % div == 0:
                return False
            else:
                return True

【问题讨论】:

  • 问题是什么?
  • 单步调试您的代码。你试过什么?
  • 作为一个效率说明你只需要从 2 到 num/2 进行测试
  • (num ** .5) +1 或 math.sqrt(num)+1 实际上。
  • protip:在eprimo 的第一行放import pdb; pdb.set_trace() - here 是一个相当不错的教程,如果你需要的话。

标签: python numbers primes


【解决方案1】:

无论您是否完成检查,您都将从该 for 循环的第一次迭代中返回。除非数字绝对不是素数,否则您不应该从循环内部返回。删除 else 并仅在循环结束时返回 True

def eprimo(num):
    if num < 2:
        return False
    if num == 2:
        return True
    else:
        for div in range(2,num):
            if num % div == 0:
                return False
        return True

优化附注:您真的不需要检查直到num 的所有除数候选。您只需要检查到num 的平方根。

【讨论】:

    【解决方案2】:

    for 循环在第一次迭代后立即退出,当它检查您的数字是否可被 2 整除时。如果您的数字是偶数,它将返回 False;否则,它将返回True

    解决方法是不要立即返回True;而是等待循环中所有迭代的结束:

    for div in range(2, num):
        if num % div == 0:
            return False
    return True
    

    或者,使用all() 构造:

    return all(num % div != 0 for div in range(2, num))
    

    【讨论】:

      【解决方案3】:

      您可以提取偶数的测试,然后仅循环奇数,而不是测试 range(2,num) 中的所有除数。此外,正如蜥蜴比尔建议的那样,您可以停在 num 的平方根处。这将快两倍:

      def eprimo(num):
          if num < 2:
              return False
          if num % 2 == 0:
              return num == 2
          div = 3
          while div * div <= num:
              if num % div == 0:
                  return False
              div += 2
          return True
      

      【讨论】:

        猜你喜欢
        • 2015-03-17
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 2011-05-06
        • 2020-08-24
        • 2021-04-20
        相关资源
        最近更新 更多