Project Euler 8 最大相邻13位数的乘积
这是关于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))