我正在努力为这个问题找到一个可接受的答案:http://www.spoj.com/problems/PRIME1/ 这不是什么新鲜事,只是想要在两个给定数字之间生成素数。最后,我编写了以下内容。但是spoj给了我运行时错误(nzec),我不知道应该如何处理它。我希望你能帮助我。提前谢谢。
def is_prime(m,n):
myList= []
mySieve= [True] * (n+1)
for i in range(2,n+1):
if mySieve[i]:
myList.append(i)
for x in range(i*i,n+1,i):
mySieve[x]= False
for a in [y for y in myList if y>=m]:
print(a)
t= input()
count = 0
while count <int(t):
m, n = input().split()
count +=1
is_prime(int(m),int(n))
if count == int(t):
break
print("\n")
答案 0 :(得分:1)
查看问题定义:
在接下来的每一行中,有两个数字m和n(1 <= m <= n <= 1000000000,n-m <= 100000),用空格分隔。
查看您的代码:
mySieve = [True] *(n + 1)
因此,如果n
为1000000000
,您将尝试创建1000000001布尔值的列表。这意味着你要求Python为十亿个指针分配存储空间。在一个64位的平台上,这是8GB - 就Python而言很好,但可能会让你的系统陷入交换地狱或被限制或监视器杀死。在32位平台上,这是4GB,这将保证MemoryError
。
问题也明确地有这个警告:
警告:输入/输出数据较大,请注意某些语言
因此,如果您想以这种方式实现它,您将不得不想出一个更紧凑的存储。例如,array.array('B', [True]) * (n+1)
只需要1GB而不是4或8.如果你以比特而不是字节存储它,你可以使它更小(128MB),但这并不是一个微不足道的变化代码。
答案 1 :(得分:0)
计算两个数字之间的素数是没有意义的。您只能使用之前找到的其他素数计算素数直到给定数字,然后才显示您想要的范围。
这是一个python代码和一些计算的素数,你可以继续使用它们:
bzr branch http://bzr.ceremcem.net/calc-primes
这段代码有些微不足道,但工作正常,测试得很好。