我正在开发一个能找到n
的程序。素数。例如,通过列出前六个素数:2, 3, 5, 7, 11
和13
,我们可以看到第6个素数是13
。我试图制作一个算法,比如,如果我想看到第50个素数,我会将1
添加到range()
函数的末尾。我现在使用这种算法来寻找素数;
cnt = 1
print (2)
for x in range(3,40,2):
div = False
for y in range(2,round(x**0.5)+1):
if x%y == 0:
div = True
if div == False:
print (x)
cnt += 1
print ("\nThere is {} prime numbers.".format(cnt))
你看,我把40
。但是我想把n
放在那里,例如,直到达到第50个素数,向n
添加+1。但是,如果我尝试了类似的东西,它就不会那样了。
cnt = 1
n = 40 #example
while cnt<50:
for x in range(3,n,2):
#codes
if div == False:
n += 1
我认为当程序找到素数时,它会向n
添加+1并且while
循环将处理直到找到第50个素数。但它没有,如果我也使用这个,素数是错误的,没有什么与我想做的相关。
如何制作此算法,显然更改range()
函数的最后一个元素不起作用。
有更好/优雅的算法/方法吗?如果我想找到200.000th
素数,我需要更快的代码。
编辑:我首先使用列表,但是在使用大数字时我总是得到MemoryError。所以我传递了它并使用一个变量来计算有多少质数cnt
。
答案 0 :(得分:3)
这是一个更快的版本
primes = []
primecount = 0
candidate = 2
while primecount<50:
is_prime = True
for prime in primes:
if candidate%prime == 0:
is_prime = False
break
elif candidate < prime**2:
break
if is_prime:
primes.append(candidate)
primecount += 1
candidate += 1
print primes[-1]
请注意小编辑添加OP包含的candidate<prime**2
测试但我最初忽略了。
由于多种原因,您的代码会非常慢。如果2除以一个数字,你知道它不是素数,但你仍然在检查3或4或5 ......是否将它分开。一旦你知道它不是素数,你就可以爆发。另一个主要问题是如果2不分数,那么就没有理由检查4是否也将它分开。因此,您可以将注意力仅限于检查在它之前是否存在素数。
就运行时间而言:
答案 1 :(得分:-1)
首先,为了向后兼容python 2,我在你的root x舍入周围添加了int()
。
根据我对你的问题的理解,你正在寻找这样的东西:
cnt = 1
maximum=50 #Specify the number you don't want the primes to exceed
print (2)
n=20 #highest number
while cnt<maximum: #
for x in range(3,n,2): #using "n" as you hoped
div = False
for y in range(2,int(round(x**0.5)+1)):
if x%y == 0:
div = True
if div == False:
if x<maximum: #we only want to print those up to the maximum
print str(x)
else: #if it is greater than the maximum, break the for loop
break
cnt += 1
break #break the while loop too.
print ("\nThere are {} prime numbers.".format(cnt))
这给了我正确的素数。至于更好/更优雅的解决方案。如果您希望速度更快,请使用具有优化的库,或者查看this以获取快速程序的示例。优雅是主观的,所以我会把它留给互联网的其余部分。