Python素数代码在spoj上给出运行时错误(NZEC)

时间:2014-07-29 20:39:20

标签: python python-3.x runtime-error primes

我正在努力为这个问题找到一个可接受的答案: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")

2 个答案:

答案 0 :(得分:1)

查看问题定义:

  

在接下来的每一行中,有两个数字m和n(1 <= m <= n <= 1000000000,n-m <= 100000),用空格分隔。

查看您的代码:

  

mySieve = [True] *(n + 1)

因此,如果n1000000000,您将尝试创建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

这段代码有些微不足道,但工作正常,测试得很好。