"Самый большой продукт в серии" Python-код
После преобразования строки в массив я действительно не знаю, почему это не работает... Можете ли вы объяснить, в чем моя ошибка, пожалуйста?
Найдите тринадцать соседних цифр в 1000-значном числе, которые имеют наибольшее произведение. Какова стоимость этого продукта?
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 ответа
В вашем цикле вы умножаете произведение на j
: product *= j
, но вы хотите умножить его на элемент в new
с указателем j
поэтому просто поменяйте строчку product *= j
в product *= 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)
Вот еще несколько оптимизаций, которые вы можете рассмотреть. Прямой подход требует 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))
Ответ @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