试图使用Python查找素数

时间:2015-01-01 11:36:12

标签: python

下面是我使用Python找不到素数的代码。这里函数prime将取整数作为输入,并返回其是否为素数。你能解决问题并解释一下吗。

def prime(x):
    if x == 0 or 1:
        return False
    elif x == 2:
        return True
    else:
        for n in range(2, x):
            if x % n == 0:
                return False
            else:
                return True

我想我已经解决了第一个问题,第一个“if”语句应该是if x == 0 or x == 1。那么其余的呢。

3 个答案:

答案 0 :(得分:1)

您的for循环是什么?

if x % n == 0:
    return False
else:
    return True

顺便说一下eqals return bool(x % n)

因此,您在第一次迭代时返回n == 2

整个 for循环等于return bool(x % 2),它只会检查x是否可被2分割。
那不是你想要的。

那么,你想要什么?

您想要检查来自x的任何数字是否都无法归待range(2, x)

如果您从x找到一个 n,您知道range(2, x) 不是素数,{{1}是} x % n == 0 如果True中有{strong>否 xnrange(2, x),则x % n == 0为素数。

您何时可以说范围中的True都不是n的除数? 后检查范围内的所有x

之后是关键。
循环之后,您尝试查找除数,您只能告诉n是素数。

我希望您现在能够理解其他人发布的代码而无需解释。


注意:替代语法

其他人发布的代码是正确的。但是,在Python中,使用for .. else

编写for的第二种方式
x

答案 1 :(得分:0)

问题是在return true循环完成之前for不应该发生。

我们在原始代码中所拥有的是一些针对琐碎案例的测试(x小于3) 然后是一个测试所有较大数字的循环。

在循环中,尝试将x除以较小的数字(从2开始),然后如果它均匀地分开False则返回,如果它不返回True,则为错误,而不是返回true,应该允许循环重复,并且应该使用下一个数字再次尝试除法,并且只有在除数的提供(来自for循环)已经用尽之后才应该返回。

这是一个固定版本:

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

        return True

其他人评论说,循环不需要一直持续到x,并且停止在sqrt(x)就足够了,它们是正确的。这样做几乎在所有情况下都会更快。

如果你有一个小素数列表(高达sqrt(x)),你可以获得另一个加速 - 你只需要通过sqrt(x)以下的素数来测试可分性,而不是该范围内的每个整数。

答案 2 :(得分:0)

以下代码用于查找从2到n号的素数。 例如,下面的代码将打印从2到50的素数,并且它将打印2到5o之间的数字,这不是素数。

import time
i=2
j=2
count=0
while(i<50):
 while (i>j):
    if (i%j)==0:
      count=count+1
      j=j+1
    else:
      j=j+1
 if count==0:
    print i," is a prime"
 else:
    print i," is not a prime"
 i=i+1
 j=2
 count=0
 time.sleep(2)