Project Euler 8 最大相邻13位数的乘积

-1 投票
2 回答
1059 浏览
提问于 2025-04-18 17:46

这是关于Project Euler第8题的讨论。它在处理4位数字时能正常工作,但在处理13位数字时就不行了。我查阅了相关资料,但还是没有找到解决办法!我得到的错误结果是5377010688。

import pyperclip
import math
import urllib2
import re
import string

def adjacent_product(length):
  response = urllib2.urlopen('http://projecteuler.net/problem=8')
  html = response.read()
  m = re.search(r'<p style="font-family:courier new;text-align:center;">(.*?)</p>',html,re.DOTALL)
  numbers = m.group(1)
  numbers = string.replace(numbers,'<br />', '')
  number_list = numbers.split('\n')[:-1]
  new_numbers=[]
  for numbers in number_list:
    numbers = string.replace(numbers,'\r','')
    new_numbers.append(numbers)
  number_list = new_numbers[1:]

  product_max=1

  for number in number_list:    
    for i in range(0,len(number)-length):
      product = 1
      for n in range(0,length):
        product*=int(number[i+n])
      if product>product_max:
        product_max=product
  pyperclip.copy(product_max)
  print product_max
adjacent_product(4)

2 个回答

0

你应该把你的 number_list 变成真正的数字列表,而不是数字字符串的列表:

number_list = [int(char) for number in number_list for char in number]

之后,你可以通过取 number_list 中每五个数字一组,计算这组数字的乘积。然后找出最大的那个:

from operator import mul

quintuples = (number_list[i:i+5] for i in xrange(len(number_list) - 4))
results = (reduce(mul, quintuple) for quintuple in quintuples)
return max(results)
1

看起来你误解了问题:这里是 一个1000位的数字,而不是几个数字的列表。

你需要修改你的循环:

for number in number_list: 

改成这样:

number = "".join(number_list)

你的代码在处理4位数字时能正常工作,因为那个 9989 可以在一行的中间找到,但在处理13位数字时就不行了,因为最大的数字序列跨越了第四行和第五行。


另外,既然 number 是把整个数字作为一个字符串存储的,你可以把你的代码简化成这样:

max(reduce(operator.mul, map(int, number[i:i+n])) for i in range(len(number)-n+1))

撰写回答