-1
def fact(n):
    fac = 1
    while (n>1):
        fac = fac*n
        n -= 1

    return fac

z = 0
t = int(raw_input())
nz = []
for i in range(0,t):
    c = 0
    n = int(raw_input())
    z = fact(n)

    z = list(str(z))
    for j in range(len(z)-1,1,-1):
        if z[j] != '0':
            break
        else:
            c +=1
    nz[i].append(c)
for k in range(0,t):
    print nz[k]

こんにちは私は取得しています

Indexerror : " nz[i].append(c) でインデックスが範囲外です

このプログラムは、N の階乗の末尾のゼロを計算する必要があります。N の大きな値に対しても実行できるように、コードを最適化するのを手伝ってもらえますか?

4

2 に答える 2

6

nz空のリストです。要素がないため、nz[i]常に が発生しIndexErrorます。おそらくあなたはnz.append(c)つまりを意味しました。cの末尾に追加しnzます。

于 2013-04-02T16:42:40.933 に答える
0

これはappend()がどのように機能するかです:

list.append(x)

リストの最後に項目を追加します。a[len(a):] = [x] と同等です。

インデックスはすでに追加機能によって処理されているため、に変更することをお勧めしnz[i].append(c)ます。空のリストを使用しているため、実際にはリストに要素があると想定していますが、これは誤りですnz.append(c)ii

最適化について、あなたの問題はおそらく再帰制限が原因です。Python シェルで試してみるimport sys; sys.getrecursionlimit()と、結果として 1000 のようなものが表示されるはずです。

階乗関数の反復バージョンへの交換が出発点になる可能性があります

def fact(n):
    r = 1
    for x in range (n):
        r = r * (x+1)
    return r
于 2013-04-02T16:48:08.137 に答える