Project Euler第8题:13位连续数字最大乘积代码错误排查求助
Project Euler 第8题代码问题排查
问题点分析
循环范围错误
遍历起始索引的范围计算有误,导致遗漏部分连续13位数字的组合。原代码中range(len(collapse) - size - 1)会提前终止循环,正确的范围应该是range(len(collapse) - size + 1)——当起始索引为len(collapse)-size时,刚好能取到最后13个元素,循环需覆盖到这个索引。内层循环逻辑错误
计算乘积的代码被放在填充window的内层循环中,导致每填充一个元素就计算一次乘积。而只有当window被完全填满13个元素时的乘积才是有效的,之前的计算会因为窗口未填满(包含初始0值)产生无效结果,干扰最大乘积的判断。冗余的numpy数组使用
用numpy数组存储窗口完全没必要,直接使用Python列表切片即可完成操作,还能避免额外的类型转换开销。
修正后的代码
from functools import reduce # 读取文件并拼接成完整的数字字符串 with open('Euler_8.txt') as file: digits = file.read().replace('\n', '') # 转换为整数列表 digit_list = [int(c) for c in digits] window_size = 13 max_product = 0 # 遍历所有可能的连续13位数字窗口 for i in range(len(digit_list) - window_size + 1): current_window = digit_list[i:i+window_size] product = reduce(lambda x, y: x * y, current_window) if product > max_product: max_product = product print(max_product)
修正说明
- 简化文件读取:直接读取所有内容并移除换行符,一步得到完整的1000位数字字符串,无需分步处理每行再拼接。
- 修正循环范围:确保所有连续13位数字的组合都被遍历到。
- 移除无效逻辑:通过列表切片直接获取完整窗口,填充完成后再计算乘积,避免无效计算。
- 代码更简洁易读,减少了不必要的中间变量和类型转换。
内容的提问来源于stack exchange,提问作者Daniel T. McGuiness
相关产品推荐
相关产品推荐

