Euler项目问题8的Python解决方案

z6psavjg  于 2022-12-01  发布在  Python
关注(0)|答案(1)|浏览(184)

我试图解决的问题,最大的产品在一系列从项目欧拉网站。
https://projecteuler.net/problem=8
我基本上,

  • 我将这1000位数保存为文本文件
  • 将其转换为字符串
  • 创建了一个名为window的数组来存储
  • 该数组遍历1000位数组并存储相邻的位数,将这些位数相乘并只保留最大值。

这个代码对给出的示例答案有效(对于4个数字,它实际上计算出了5832)。问题是代码错误地计算出了13位数的答案,我似乎找不到问题所在。
这是我的代码

from functools import reduce
import numpy as np

# open the textfile
with open('Euler_8.txt') as file:
    lines = file.readlines()

# remove the \n from each line
mappedLines = list(map(lambda s: s.strip(), lines))

p = []

for ls in mappedLines:
    p.append(list(ls))

collapse = sum(p, [])  # collapsing of matrix

window = np.zeros(13)
size = len(window)

maxValue = 0
for a in range(len(collapse) - size - 1):
    for b in range(size):
        window[b] = collapse[a + b]

        intWin = list(map(int, window))

        mult = reduce(lambda x, y: x * y, intWin)
        if mult > maxValue:
            maxValue = mult

print(maxValue)

你能帮我找出问题所在吗?
感谢您抽出宝贵时间。

ccrfmcuu

ccrfmcuu1#

b循环中计算intWinmult,得到的是新窗口和旧窗口的混合,结果得到的乘积有时会太大。相反,只有在填充了当前窗口后,才应该计算intWinmult
但实际上,您的代码过于复杂,不需要reduce或numpy或单独的窗口数组(特别是当该数组是一个浮点数组时,它可能有也可能没有足够的精度来执行计算)。您的代码还省略了包含输入中最后一位数字的窗口,尽管在这种情况下这并不重要。
例如,这是代码的简化(和更正)版本。

with open('Euler_8.txt') as file:
    lines = file.readlines()

digits = ''.join(line.strip() for line in lines)
digits = [int(x) for x in digits]

size = 13
maxValue = 0
for a in range(len(digits) - size):
    prod = 1
    for b in range(size):
        prod *= digits[a + b]
    maxValue = max(maxValue, prod)

print(maxValue)

相关问题