测试121时is_prime函数失败,不知道为什么

时间:2013-12-19 23:17:49

标签: python primes modulo

我正在尝试编写一个取整数x的函数,如果是prime则返回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

1 个答案:

答案 0 :(得分:8)

你几乎拥有它。你只需要一个微小的改变

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,所以我进去了)
      • 返回True&lt; - 糟糕!

所以你需要做的是,在决定返回之前完成遍历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