项目欧拉8大相邻13位数产品

时间:2014-08-19 10:41:07

标签: python

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 :(得分: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))

答案 1 :(得分: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)