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)
答案 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)