[英]NZEC error in python code
我的代碼在我的機器上運行得非常好,但是當它被spoj編譯時它給出了M + NZEC erro。 這是我的問題的鏈接: http : //www.spoj.com/problems/CPRIME/
這是我的代碼:
def smallPrimes(n):
"""Given an integer n, compute a list of the primes <= n"""
if n <= 1:
return []
sieve = range(3, n+1, 2)
top = len(sieve)
for si in sieve:
if si:
bottom = (si*si - 3)//2
if bottom >= top:
break
sieve[bottom::si] = [0] * -((bottom-top)//si)
return [2]+filter(None, sieve)
from math import *
import sys
def main():
flag=True
while(flag==True):
x=input()
if(x==0):
flag=False
return 0
z=x/log(x)
v=len(smallPrimes(x))
print round((abs(v-z)*100/(v)),1)
if __name__ == "__main__":
main()
在SPOJ中,當Python腳本執行中發生異常時,會引發NZEC錯誤。 在你的情況下,因為輸入中的問題被明確指定並且終止於零,所以它不能因為考慮輸入而考慮。
該錯誤很可能是因為使用了比允許更多的內存。 在您的問題中,內存限制指定為256 MB。 但是在你的代碼中
sieve = range(3, n+1, 2)
該行聲明了一個大小約為n / 2的列表。 當,n = 10 ^ 8,這意味着你將聲明一個具有5 * 10 ^ 7整數的列表,這些整數具有天真的近似值並且忽略所有開銷將是
(5*10^7)*4 bytes
~ 200 MB
包括第二個大清單聲明的開銷和其他內存使用情況
[0] * -((bottom-top)//si)
它可以達到大約130 MB而忽略了所有開銷,你將超出內存限制,只是在列表中存儲那么多整數。 我的機器上的代碼注意到大約1 GB的內存使用量。 所以你的代碼超過了SPOJ的內存限制,它引發了異常。
最好的辦法是優化您的方法,在這些問題中很少需要聲明10 ^ 8的順序列表。 我可以看到一種方式,你不需要聲明一個大的列表,但由於這是一個在線評判的問題,最好讓你弄清楚這種方法。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.