【问题标题】:is_prime function fails when testing 121, don't know whyis_prime 函数在测试 121 时失败,不知道为什么
【发布时间】:2013-12-19 23:17:49
【问题描述】:

我正在尝试编写一个函数,它接受一个整数 x,如果素数则返回 True,否则返回 False。它工作正常,除了测试数字 121 时,我不知道为什么。这是我的代码:

def is_prime(x):
    if x < 2:
        return False
    elif x == 2:
        return True
    else:
        for i in range(2,x):
            if x%i == 0:
                return False
            else:
                return True

在检查 121 时,它似乎跳过了 if x%i == 0:,因为 121%11 为 0,但它不会返回为 False。我在这里遗漏了一些明显的东西吗?我很感激我能得到的任何帮助,谢谢。哦,我正在使用 Python 2.7

【问题讨论】:

  • @VincentShowcaseWorkshop 不是。您链接的问题的所有答案都使用试除法,这是检查数字是合数还是素数的最差方法。
  • 删除了我的评论,以免让他误入歧途 :) 为您的评论干杯。

标签: python primes modulo


【解决方案1】:

你几乎拥有它。你只需要一点点改变

def is_prime(x):
    if x < 2:
        return False
    elif x == 2:
        return True
    else:
        for i in range(2,x):
            if x%i == 0:
                return False
        return True

您面临的问题是由于您不允许循环在返回之前完成所有数字的检查

考虑在 121 上运行代码时的前几次迭代:

函数说:

  • x 是否小于 2?
    • 没有。继续
  • x 正好是 2 吗?
    • 没有。继续
  • 对于所有数字,从 2 到 x-1 (for i in range(2,x))
    • 现在i 是 2
    • 121%2 正好是 0?
      • 没有。继续
    • 否则(嗯,121%2 不是 0,所以我进入这里)
      • 返回真

因此,您需要做的是,在决定返回之前完成该 for 循环中的所有这些数字的运行,这就是我的修复方法。

当然(正如 Joran Beasley 所说),您可以利用任何数字的除数都不大于其平方根的知识。所以你只需要检查数字本身的平方根:

def is_prime(x):
    if x<2:
        return False
    if x == 2:
        return True
    else:
        for i in xrange(2, int(sqrt(x))+1):
            if not n%i:
                return False
        return True

【讨论】:

  • 值得注意的是,他可能应该在 int(sqrt(x)) 结束他的范围
  • 哦,真的!我会把它带到range(3, int(sqrt(x)),因为他已经在测试 2
  • 但他没有测试可被 2 整除...除非我错过了它
  • 哇,就是这样,逻辑很合理。我也很喜欢将范围更改为范围(3,int(sqrt))。好东西。谢谢!
  • 如果你确实先检查可被 2 整除,那么你可以使用xrange(3, int(sqrt(x)+1), 2),它是试除数的一半。或者首先检查 2、3,然后执行 xrange(6, int(sqrt(x)+2), 6),但在每个循环中测试 i-1i+1 而不是 i。以此类推,收益迅速递减。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2014-04-08
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多