我试图解决的问题,最大的产品在一系列从项目欧拉网站。
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)
你能帮我找出问题所在吗?
感谢您抽出宝贵时间。
1条答案
按热度按时间ccrfmcuu1#
在
b
循环中计算intWin
和mult
,得到的是新窗口和旧窗口的混合,结果得到的乘积有时会太大。相反,只有在填充了当前窗口后,才应该计算intWin
和mult
。但实际上,您的代码过于复杂,不需要
reduce
或numpy或单独的窗口数组(特别是当该数组是一个浮点数组时,它可能有也可能没有足够的精度来执行计算)。您的代码还省略了包含输入中最后一位数字的窗口,尽管在这种情况下这并不重要。例如,这是代码的简化(和更正)版本。