“系列中最大的产品”Python代码

时间:2018-01-02 16:47:40

标签: python euler-angles

将字符串转换为数组后,我真的不知道为什么这不起作用...你能解释一下我的错误吗?

查找具有最大产品的1000位数字中的13个相邻数字。这个产品的价值是什么?

seq = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'
new = []
for n in seq:
    new.append(int(n))

max_prod = 0
for i in range(0, len(new)-13):
    product = 1
    for j in range(i, i+13):
        product *= j
    if product > max_prod:
        max_prod = product
print(max_prod)

3 个答案:

答案 0 :(得分:3)

在您的循环中,您将产品乘以jproduct *= j,但您希望将其乘以new中的元素与索引j,因此只需更改行product *= jproduct *= new[j]

更正程序:

seq = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'
new = []
for n in seq:
    new.append(int(n))

max_prod = 0
for i in range(0, len(new)-12):
    product = 1
    for j in range(i, i+13):
        product *= new[j]
    if product > max_prod:
        max_prod = product
print(max_prod)

答案 1 :(得分:1)

@ karan-elangovan的回答显示了您的代码有什么问题。您可以使用列表推导和切片来改进代码。

例如

new = []
for n in seq:
    new.append(int(n))

变为

new = [int(n) for n in seq]

product = 1
for j in range(i, i+13):
    product *= new[j]

可以成为

product = 1
for n in new[i:i+13]:
    product *= n

答案 2 :(得分:1)

您可能需要考虑以下一些优化措施。直接方法需要988 x 12 = 11,856次乘法。我们可以将其减少到527次乘法和239除法:

from functools import reduce
from operator import mul

seq = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'

# we need only consider stretches with no zero in it:
bits = seq.split('0')

# comparing neighboring stretches
# 
# bit[i] * bit[i+1] * bit[i+2] * ... * bit[i+12]
#          bit]i+1] * bit[i+2] * ... * bit[i+12] * bit[i+13]
#
# we see that they have 12 factors in common, so we can get the second product
# by dividing the first by bit[i] and multiplying by bit[i+13]
#
def max13(bit):
    if len(bit) < 13:
        return 0
    else:
        # next line does the same as @DanielGee's list comprehension
        # map applies its first arg (a function) to each element of its
        # second arg (a sequence) to create a new sequences
        # in Python2 the output used to be a list, in Python3 it's an iterator
        # so we need to cast to tuple or list
        bit = tuple(map(int, bit))
        mx = current = reduce(mul, bit[:13])
        for hire, fire in zip(bit[13:], bit[:-13]):
            # important: use integer division '//'
            current //= fire
            current *= hire
            if current > mx:
                mx = current
        return mx

# finally, we just need to take the max over all bits
result = max(map(max13, bits))