我的问题是看到我在一个长号码中骑自行车,以找到所述号码中连续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
答案 0 :(得分:0)
在reduce
切片上使用N
的完美案例:
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
会将所有项目相乘,没有可见的循环,也不会对术语数量进行硬编码。
答案 1 :(得分:0)
你可以非常简洁地做到这一点,首先将整个整数转换为一系列数字,然后使用reduce
,mul
和切片计算滑动窗口的产品。
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中讨论的算术方法。