我是python的新手,我有一个任务。给定一个数字作为输入,我必须在从位置1开始而不是0的素数列表上打印属于该数字/位置的素数,直到输入为'END'。例如,如果输入为1,则输出应为2的第一个素数;如果输入为5,则输出应为11的第5个素数,依此类推。它工作正常,但在3/4位数字后,输出会有一个延迟,直到我得到错误:超过时间限制。我如何使其运行更快?这是代码:
def primes_function(n):
primes = []
num = 2
while len(primes) <= n:
x = num // 2
while x > 1:
if num % x == 0:
break
x -= 1
else:
primes.append(num)
num += 1
return primes[n - 1]
#main
while True:
n = input()
if n == 'END':
break
elif n > '0':
n = int(n)
value = primes_function(n)
print(value)
对不起,如果我在说明中犯了任何错误 enter image description here
答案 0 :(得分:1)
def SieveOfEratosthenes():
n = 1000000
prime = [True for i in range(n+1)]
p = 2
count = 0
while (p * p <= n):
if (prime[p] == True):
count = count + 1
for i in range(p * p, n+1, p):
prime[i] = False
p += 1
seive = []
for p in range(2, n):
if prime[p]:
seive.append(p)
return seive
def primes_function(n , seive):
return seive[n - 1]
#main
seive = SieveOfEratosthenes()
while True:
n = input()
if n == 'END':
break
elif n > '0':
n = int(n)
value = primes_function(n,seive)
print(value)
完全正常:https://ide.geeksforgeeks.org/QTSGQfhFV3
我已经预先计算了10 ^ 6以下的质数,并列出了质数,并通过索引访问了第n个质数。
答案 1 :(得分:1)
我结合了this answer (1)和this answer (2)来加快功能。两个关键思想是:在测试候选人的素数时...
import math
def nth_prime(n):
prime_list = [2]
candidate = 3
while len(prime_list) < n:
max_factor = math.sqrt(candidate)
is_prime = True
for p in prime_list:
if p > max_factor:
break
elif candidate % p == 0:
is_prime = False
break
if is_prime:
prime_list.append(candidate)
candidate += 2
return prime_list[-1]
n=9000 n=15000 n=25000 n=75000
your solution 1m38.455s - - -
linked answer (1) 0m 2.954s 8.291s 22.482s -
linked answer (2) 0m 0.352s 0.776s 1.685s 9.567s
this answer 0m 0.120s 0.228s 0.410s 1.857s
Brij's answer 0m 0.315s 0.340s 0.317s 0.318s
对于每个n
程序,都是从头开始的。
我们可以看到,Brij的Eratosthenes筛网耗时很短。如果要查找固定限制以下的大素数,那是最好的解决方案(此处n <78499,因为第78499- 个素数为1 000 003,它大于筛子列表)。
如果您还想找到许多较小或中等大小的素数或不能接受固定的限制,请使用此解决方案。