获得实践经验,我正试图解决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()
但是,当我发送代码时,我会超时限制。我怎么能让我的代码足够快?
答案 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
这个实现应该没问题。但是您可以在上面的链接中找到一些额外的优化。
请注意,0
和1
不是素数。
答案 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 。