调试Python Prime编号程序

时间:2016-07-25 12:06:17

标签: python debugging

我为Python素数生成器编写了代码,以生成前100个素数。但是,不知何故,我在输出中得到22,25等非素数。我现在一遍又一遍地重新检查了几个小时,但仍然无法弄清楚我哪里出错了......请帮忙!

这是我的代码:

from math import sqrt

y=[2]
x=3

while len(y)!=100:
   for i in range (2,int(round(sqrt(x)+1))):
     if x%i==0:
        x=x+1

     else:
        y.append(x)
        x=x+1
        break

print(y)

6 个答案:

答案 0 :(得分:7)

我会这样做的;更多Pythonic:

super(ClassName, self).__init__()

y = [2] x = 3 while len(y) < 100: if all(x % i != 0 for i in range(2, int(round(sqrt(x) + 1)))): y.append(x) x = x + 1 print(y) 功能非常有用。

这与你所做的更相似;请注意all()声明及其作用:

break

答案 1 :(得分:4)

其他答案都是正确的,但没有一个表明您可以在else循环上实际使用for子句。阅读有关此here的更多信息。所以你不需要if is_prime:语句。生成的代码看起来像这样。

 from math import sqrt

 y = [2]
 x = 3

 while len(y) != 100:
    for i in range (2, int(round(sqrt(x) + 1))):
        if x % i == 0:
            x = x + 1
            break

    else:
        y.append(x)
        x = x + 1
print(y)

提示:x+=1可以取代x=x+1

此外,作为@ user2346536,您实际上可以使用更有效的算法来计算素数,如果您循环大数,这将非常重要。

答案 2 :(得分:2)

你的其他内容应该在for循环之外。只要它没有被“至少一个i”划分,而不是“不能被每个i分割”,你就在x中将x附加到你的数组

此算法也非常低效。快速试一试: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

from math import sqrt

y=[2]
x=3

while len(y)!=100:
    prime = True
    for i in [ i for i in y if i < sqrt(x) + 1 ]:
        if x%i==0:
            prime = False
            break

    if prime:
        y.append(x)

    x=x+1


print(y)

请注意,我已经通过仅划分先前找到的素数来优化您的算法。

答案 3 :(得分:0)

你对一个数字的测试是错误的。你检查一个数字是否可被i整除,从2变为sqrt(x)这是正确的,但只要你点击一个不是因素的数字你就会认为这个数字是素数,是不正确的。您必须检查所有数字,如果没有因素,那么您可以得出结论:您的数字是素数:

from math import sqrt

y=[2]
x=3

while len(y)!=100:
    isPrime=True
    for i in range (2,int(round(sqrt(x)+1))):
        if x%i==0:
            x=x+1
            isPrime=False
            break             # See Mr Nun's answer
    if(isPrime):
        y.append(x)
        x=x+1

print(y)

正如有人指出的那样,这不是一个非常有效的解决方案。查看@ user2346536答案中的链接。

答案 4 :(得分:0)

正如user2346536所说,你的其他人不应该在循环中。您只会查看i = 2

的元素

怎么做:

from math import sqrt, ceil
prime_list = [2]
x = 2
while prime_list != 100:
    x += 1
    is_prime = True
    for element in range(2,int(ceil(sqrt(x)))):
        # if x is divided, then we go to next iteration
        if x%element == 0:
            is_prime = False
            break
    if is_prime:
        y.append(x)

答案 5 :(得分:0)

使用Eratosthenes筛网规则查找素数

# Find Prime Numbers using Sieve of Eratosthenes rule
listPrime = []  #create a list and add 1 to 100 nunbers
for i in range (1, 101):
    listPrime.append (i)
print("The Numbers are: " + str(listPrime))

for i in range (2, 101):
    for j in range (i, 101): 
        z = i * j
        if (z > 100):
            break
        else:
            if z in listPrime:
                listPrime.remove(z)

print ("The Prime Numbers are: " + str(listPrime))