-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]

你好我得到

索引错误:索引超出范围“nz[i].append(c)

这个程序应该计算 N 的阶乘中的尾随零。你能帮我优化我的代码,所以它也可以在 N 的大值下运行吗?

4

2 回答 2

6

nz是空列表。它没有任何元素,所以nz[i]总是 raise IndexError。也许你的意思是nz.append(c)ie。c在末尾添加nz

于 2013-04-02T16:42:40.933 回答
0

这就是append()的工作方式:

list.append(x)

在列表末尾添加一个项目;相当于 a[len(a):] = [x]。

因此您可能需要更改nz[i].append(c)nz.append(c),因为您的i索引已由 append 函数处理。你实际上假设你i的列表中有一个元素,这是错误的,因为你使用的是一个空列表

关于优化,您的问题可能是由于您的递归限制。在你的 python shell 中尝试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 回答