1

我很抱歉提出这样一个愚蠢的问题,但我在用 Python 编写一个非常基本的程序来检查一个数字是否是素数时遇到了问题。

这是我的代码:

def is_prime(x):
    if x < 2:
        print ('Please enter a number >= 2.')
    else:
        if x == 2 or x == 3 or x == 5:
            return True
        if x == 4:
            return False
        for num in range (2, int(x/2)):
            if x % num == 0:
                return False
                break
            else:
                return True

但这对所有奇数返回 True ;不只是主要的。我不明白为什么。如果有人能指出我正确的方向,将不胜感激!:)

4

4 回答 4

2

您的代码只是检查num % 2并返回TrueFalse取决于结果。因此,它返回True所有奇数。return True如果循环没有遇到 a ,您应该return False查看代码。

def is_prime(x):
    if x < 2:
        print ('Please enter a number >= 2.')
    else:
        if x == 2 or x == 3 or x == 5:
            return True
        if x == 4:
            return False
        for num in range (2, int(x/2)):
            if x % num == 0:
                return False
        return True


>>> is_prime(11)
True
>>> is_prime(9)
False

PS-您不需要breakreturn. :)

于 2013-08-08T18:08:52.627 回答
0

您在循环中的这段代码可以防止循环多次运行;因此您只检查可被 2 整除。这是因为 return 语句会立即终止整个函数(因此您拥有的 break 也是多余的):

if x % num == 0:
    return False
    break
else:
    return True

你可能想要的是:

for num in range (2, int(x/2)):
    if x % num == 0:
            return False
return True
于 2013-08-08T18:10:47.883 回答
0

检查一个数字是否是素数(有效地)是一项非常难以完成的任务,因为素数并没有真正遵循任何不同的模式:http ://en.wikipedia.org/wiki/Primality_test

true在您的代码中,这是最直观(但效率低下)的算法,当您看到数字不能被 2 整除时,您会犯错误返回。您应该for在确定结果为 之前运行整个循环true。因此,您应该做的是return false,如果对于num循环中的某些内容,您会发现x % num == 0,否则,一旦您跳出循环,就返回true

编辑:似乎其他人的回答比我快一点,所以是的。就按照他们说的去做。

于 2013-08-08T18:13:53.367 回答
0

您的功能可以简化:

def is_prime(x):
    if x==2 or (x>2 and x%2):
        return all(x%n for n in xrange(3, int(x**0.5)+1, 2))
    return False
于 2013-08-08T18:37:04.537 回答