我目前正在研究项目欧拉问题8,该问题要求在1000位长数中找到13个相邻数字的最大乘积。我导入了numpy prod函数来计算产品。它似乎没有while循环,但使用while循环它会发出一个奇怪的错误消息。有人可以解释一下我的错误吗?
代码:
from numpy import prod
z=\
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
242190226710556263211111093705442175069416589604080
7198403850962455444362981230987879927244284909188
845801561660979191338754992005240636899125607176060
5886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
b=[int(i) for i in str(z)]
x=0
i=0
while i <=1000-13:
if prod(b[i:i+13])>x:
x=prod(b[i:i+13])
else:
pass
print(x)
这是我的错误输出:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/numpy/core/fromnumeric.py", line 2336, in prod
prod = a.prod
AttributeError: 'list' object has no attribute 'prod'
答案 0 :(得分:1)
您可以首先通过列表理解和内置函数z
将多行字符串int()
转换为数字列表:
z = """73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
242190226710556263211111093705442175069416589604080
7198403850962455444362981230987879927244284909188
845801561660979191338754992005240636899125607176060
5886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450"""
digits = [int(num) for num in z.replace('\n', '')]
请注意,通过调用z.replace('\n', '')
已从原始字符串中删除换行符。
然后你可以使用函数operator.mul()
在一行代码中完成工作:
from operator import mul
x = max(reduce(mul, digits[i:i+13]) for i in range(len(digits) - 12))
Python 3用户需要添加句子from functools import reduce
,因为最新版本的语言reduce()
不再是内置函数。
演示:
In [304]: digits
Out[304]:
[7,
3,
1,
6,
...
3,
4,
5,
0]
In [305]: x
Out[305]: 23514624000L