时间限制超过python

时间:2018-11-26 13:07:18

标签: python-3.x

我是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

2 个答案:

答案 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)来加快功能。两个关键思想是:在测试候选人的素数时...

  • ...不除以每个数字(2、3、4、5、6 ...),而仅除以前面的质数(2、3、5,...)。每个大于2的非素数都必须具有一些素数。
  • ...仅除以≤sqrt(候选)的数字。
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,它大于筛子列表)。

如果您还想找到许多较小或中等大小的素数或不能接受固定的限制,请使用此解决方案。