我为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)
答案 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))