用于检查数字x是否为python中的素数的函数

时间:2015-11-17 19:53:07

标签: python

到目前为止我所做的是:

def check_prime(x):
  if x >= 2:
    for n in range(2, x - 1):
      if x % n == 0:
        return False
      else:
        return True
  else:
    return False

但是当我检查是否有任何数字> = 2是素数时,它会返回None而不是TrueFalsecheck_prime(0)返回Falsecheck_prime(1)返回False。为什么任何数字> = 2返回None以及如何解决此问题。

4 个答案:

答案 0 :(得分:2)

您的函数错误,因为您不应该在循环中返回True(在您的代码中循环将始终运行一次)。

def check_prime(x):
    if x >= 2:
        for n in range(2, x ):
            if (x % n) == 0:
                return False
        #after the complete for n loop
        return True
    else:
        return False

结帐工作小提琴:http://pythonfiddle.com/check-prime

除此之外,您可以通过将x(向上)的平方根作为循环的终点来优化您的代码(如果您愿意)(不要忘记自range后的+1不包括在内)。因为一旦超过平方根,您将获得镜像选项。 (6×4 = 4 * 6 = 20. 20的平方根为5)。

答案 1 :(得分:0)

问题1:问题是range(n, x-1)

如果您输入的是2或3,range(2, x-1)将是一个空列表,因为range的第二个参数是独占的。

由于你只是在for循环中返回并且它永远不会到达那里,它返回None(即它什么都不返回)。

问题2:除了x = 2x = 3从未输入for循环外,您的代码还存在一些问题。

正如你所写,它将在第一次迭代中返回。当然,如果您知道x % n == 0 x不是素数而且可以返回False。但即使n不是x的因素,您仍然需要检查其他潜在因素。

您应该在for循环之外返回True,而不是在其中。

<强>解决方案:

if x == 2: return True
if x%2 == 0 or x < 2: return False
for n in range(3, x/2, 2):
  if x % n == 0:
    return False
return True

答案 2 :(得分:0)

这是您的固定代码。你有多个问题,即:

  1. 例如,当数字为2时,您进入了if周期,但是您的循环没有执行,因此您获得了None
  2. range(start, end)不包含end,因此您无需撰写end - 1
  3. 您需要检查最多n的每个号码(当您优化代码:)时,您不必这样做),但是如果我有一个像99 = 3的数字* 33,它不能被2整除,并且尽管是一个复合数字,但仍将它归类为素数。
  4. 您可以执行多项基本优化,例如最多sqrt(n)检查数字,检查数字是否可以除以2以丢弃一半选项等等。

    &#39;

    def check_prime(x):
        for n in range(2, x):
            if x % n == 0:
                return False
        return True
    

答案 3 :(得分:0)

这是一种克服它的方式......

def prime(x):

    factors = []
    if x <= 0:
        return False
    if x == 1:
        return False
    if x == 2:
        return True
    for n in range(2, x):
        if x % n == 0:
            factors.append(n)

    if len(factors) != 0:
        return False
    else:
        return True