我怎么能更快地使我的主发电机功能

时间:2015-11-27 21:16:57

标签: python python-2.7 primes

获得实践经验,我正试图解决spoj中的问题。链接中的问题要求找到给定2个数字之间的所有素数。所以我如何用python 2.7

实现它
# printing all prime numbers between given two inputs
import math
def findPrimes(num1,num2):
    for num in range(num1,num2+1):
        isPrime=True
        for i in range(2,int(math.sqrt(num))+1):
            if num%i==0:
                isPrime=False
                break
        if isPrime:
            print num


def main():
    inputs=[]
    numOfTestCases=int(raw_input())

    while(numOfTestCases>0):
        line=raw_input()
        numbers=line.split()
        inputs.append(numbers)
        numOfTestCases-=1

    for testCase in inputs:
        findPrimes(int(testCase[0]),int(testCase[1]))
        print ""

main()

但是,当我发送代码时,我会超时限制。我怎么能让我的代码足够快?

2 个答案:

答案 0 :(得分:1)

你应该使用Sieve of Eratosthenes,这很简单。首先,将所有数字初始化为素数。然后,对于每个素数,您将从素数列表中删除其倍数。它的时间复杂度接近班轮O(nloglogn)。像这样:

N = 1000
is_prime = [1]*N
for i in xrange(2,N):
    if is_prime[i]:
        for j in xrange(2*i,N,i):
            is_prime[j] = 0

这个实现应该没问题。但是您可以在上面的链接中找到一些额外的优化。
请注意,01不是素数。

答案 1 :(得分:0)

不,在spoj / PRIME1中数字并不大。 Eratosthenes的筛子在那里工作非常好,但即使是试验师,如果你通过素数进行测试,并且只测试几率(或者更好,只有6个副本或30个副本),即使是试验师也可以通过那里。

您只需提前找到低于最高限额平方根的素数。 sqrt(10^9)约为32,000,所以只有大约3,400个素数需要维持。那没什么。

6-coprimes :数字互质6,即2和3,所以在测试质数时,不需要测试除以2或3。你需要找到一种直接生成它们的方法,因此你需要测试的数字中没有2和3的倍数, by construction