Python:验证素数

时间:2014-07-13 15:11:34

标签: python

我写了下面的代码,应该检查输入的号码是否是素数,但是有一个问题我无法通过:

def main():
    n = input("Please enter a number:")
    is_prime(n)

def is_prime(a):
    x = True 
    for i in (2, a):
        while x:
            if a%i == 0:
                x = False
            else:
                x = True

    if x:
        print "prime"
    else:
        print "not prime"

main()

如果输入的数字不是素数,则显示“非素数”,因为它应该是。但如果数字是素数,则不显示任何内容。你能帮帮我吗?

5 个答案:

答案 0 :(得分:7)

有许多有效的方法来测试素性(这不是其中之一)。但是您编写的循环可以用Python简洁地表示:

def is_prime(a):
    return all(a % i for i in xrange(2, a))

也就是说,如果a和2之间的所有数字(不包括在内)在分成a时给出非零余数,则a为素数。

答案 1 :(得分:2)

有一个非常好的技巧,你只需要迭代你正在测试素数的平方根:

def is_prime(a):
    x = True 
    for i in range (2, int(a**(0.5))+1):
        if a % i == 0:
            x = False
            break

    if x:
        print "prime"
    else:
        print "not prime"

您还可以通过其他方式进行优化(在开始循环之前检查数字是否均匀)。如果您使用的是Python2,请使用xrange代替range等。

答案 2 :(得分:0)

在您的行x = False之后添加一行,在同一级别的缩进处break。这将使您的函数在找到因子后立即立即报告复合数。

有更好的方法可以确定数字是素数还是复数。如果您有兴趣,我谦虚地在我的博客上推荐文章Programming with Prime Numbers

答案 3 :(得分:0)

首先你有

for i in (2, a):

而不是

for i in xrange(2, a):

其次,你不需要x。因为如果你给它任何素数它会卡在那里。

第三是你不需要检查你是否找到了非素数,只是打印它不是素数并返回。

第四是你真的需要检查直到**(1/2)+1,因为任何大于那个的数字都不能是小除数。

这里是某种固定代码:

def main():
    n = input("Please enter a number:")
    is_prime(n)

def is_prime(a):
    for i in xrange(2, a**1/2):
        if a%i == 0:
            print "not prime"
            return
        else:
            continue

    print "prime"
    return

main()

答案 4 :(得分:0)

这是对代码的简单改进:

def is_prime(a):
    if a % 2 == 0:
        return a == 2
    for i in range (3, int(a ** 0.5) + 1, 2):
        if a % i == 0:
            return False
    return True

甚至:

def is_prime(a):
    if a % 2 == 0:
        return a == 2
    else:
        return all(bool(a % i) for i in range (3, int(a ** 0.5) + 1, 2))

然后进行一些测试:

>>> for i in range(2, 25):
...     print i, is_prime(i)
... 
2 True
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
11 True
12 False
13 True
14 False
15 False
16 False
17 True
18 False
19 True
20 False
21 False
22 False
23 True
24 False