Project Euler: 第8题

3 投票
7 回答
2067 浏览
提问于 2025-04-16 08:28
n = # some ridiculously large number, omitted
N = [int(i) for i in str(n)]
maxProduct = 0
for i in range(0,len(N)-4):
    newProduct = 1
    is_cons = 0
    for j in range(i,i+4):
        if N[j] == N[j+1] - 1:
        is_cons += 1
    if is_cons == 5:
        for j in range(i,i+5):
            newProduct *= N[j]
        if newProduct > maxProduct:
            maxProduct = newProduct
print maxProduct

我已经在这个问题上纠结了好几个小时了,还是搞不定。我在纸上试过这个算法,结果很好。你能给我一些提示,告诉我哪里出错了吗?

7 个回答

1

这里有一点需要注意:range(n, m) 这个函数会给你从 n 开始到 m 之前的所有数字,也就是说 n 是包含在内的,而 m 是不包含的。例如,range(N, N+4) 会给你接下来的 四个 数字(但是题目其实想要的是 五个 连续的数字)。

2

Marijus,我建议你重新考虑一下这个算法,这种解决问题的方法有点奇怪。其实可以简单很多,直接用 max 函数,做一次循环(比如用一个生成器表达式),尽量不使用临时变量。这个问题可以优雅地用2到3行代码解决(实际上,你甚至可以用一行代码搞定,但使用乘积函数的抽象会更好,因为你在其他欧拉问题中也会用到它)。

3

我觉得你可能误解了问题。这里说的“5个连续的数字”,其实只是指5个数字一个接一个地排列在一起,并不是说这些数字的值要是连续的(也就是说,每个数字要比前一个大)。所以你可以把所有关于is_cons的逻辑都扔掉,只需要检查每一组5个数字的乘积就可以了。

撰写回答