簡體   English   中英

python代碼中的NZEC錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM