如何在不硬编码元素位置的情况下嵌套for循环

2024-10-03 17:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是我在一个长的数字中循环,以便在所述数字中找到5个连续数字的最大乘积。我有一个解决方案,但它目前涉及到元素位置的硬编码,感觉/看起来很可怕,而且不可伸缩(如果我想要连续10个术语的总和怎么办?)。有没有一种方法可以“Python”构建这个解决方案,并以某种方式嵌套或优化它

n = 82166370484403199890008895243450658541227588666881

N = str(n)
Pro = 0
for i in range(0, len(N) - 4):
    TemPro= int(N[i])*int(N[i+1])*int(N[i+2])*int(N[i+3])*int(N[i+4])
    if TemPro> Pro :
        Pro = TemPro
print(Pro )

操作系统:Windows 7
语言:Python 3


Tags: 方法元素编码for方式数字解决方案pro
2条回答

您可以非常简洁地做到这一点,首先将整个整数转换为一系列数字,然后使用reducemul和切片计算滑动窗口的乘积

from functools import reduce
from operator import mul

n = 82166370484403199890008895243450658541227588666881

def largest_prod(n, length=5):
    digits = [int(d) for d in str(n)]
    return max(reduce(mul, digits[i:i + length]) for i in range(len(digits) - length + 1))

print(largest_prod(n))

请注意,这种查找数字的方法在理论上有点慢——无论出于何种目的,它都足够快,但它涉及到一些不必要的对象创建。如果您真的关心性能,那么可以使用类似于我在my answer here中讨论的算术方法

N片上使用reduce的最佳情况:

from functools import reduce # python 3
nb_terms = 5
for i in range(0, len(N) - nb_terms - 1):
    TemPro= reduce(lambda x,y:int(x)*int(y),N[i:i+nb_terms])
    if TemPro> Pro :
        Pro = TemPro
print(Pro)

reduce将所有项相乘,没有可见循环,也没有硬编码项数

相关问题 更多 >