2013-10-10 5 views
3
''' 
Find the greatest product of five consecutive digits in the 1000-digit number 
''' 

import time 

num = '\ 
73167176531330624919225119674426574742355349194934\ 
96983520312774506326239578318016984801869478851843\ 
85861560789112949495459501737958331952853208805511\ 
12540698747158523863050715693290963295227443043557\ 
66896648950445244523161731856403098711121722383113\ 
62229893423380308135336276614282806444486645238749\ 
30358907296290491560440772390713810515859307960866\ 
70172427121883998797908792274921901699720888093776\ 
65727333001053367881220235421809751254540594752243\ 
52584907711670556013604839586446706324415722155397\ 
53697817977846174064955149290862569321978468622482\ 
83972241375657056057490261407972968652414535100474\ 
82166370484403199890008895243450658541227588666881\ 
16427171479924442928230863465674813919123162824586\ 
17866458359124566529476545682848912883142607690042\ 
24219022671055626321111109370544217506941658960408\ 
07198403850962455444362981230987879927244284909188\ 
84580156166097919133875499200524063689912560717606\ 
05886116467109405077541002256983155200055935729725\ 
71636269561882670428252483600823257530420752963450' 

biggest = 0 
i = 1 
while i < len(num): 
    one = int(num[i]) 
    two = int(num[i+1]) 
    thr = int(num[i+2]) 
    fou = int(num[i+3]) 
    fiv = int(num[i+4]) 
    product = one*two*thr*fou*fiv 
    if product > biggest: 
     biggest = product 
    i += i+1 
print(product) 

start = time.time() 
elapsed = (time.time() - start) 
print("This code took: " + str(elapsed) + " seconds") 

Этот код дает мне ответ 7054, который слишком низок, и должен вычислять множество продуктов по пути, но только вычисляет 9 из них. Мой вопрос: что заставляет мой код отклоняться от намеченной цели, а также как я могу оптимизировать часть кода, вычисляя «один», «два» и т. Д., Чтобы рассчитать продукт? Спасибо за любой совет!Project Euler # 8 in Python

+1

Во-первых, Python - это 0-индексный язык. В коде вы начинаете с 1, чтобы пропустить первый элемент. – Anycorn

ответ

0

вопрос здесь:

i += i+1 

Вы удваивая i каждый раз и добавляя 1 к нему. Так что если i равно 1, вы делаете это 3. Если это 3, вы делаете это 7. Если это 7, вы делаете это 15 и так далее. Но это означает, что ваш индекс не хватает места, не так ли!

Это приводит к пропуску многих позиций в номере. Вы хотите использовать:

i += 1 

Это просто означает, что добавить 1 к i.

Или вы могли бы сделать:

i = i+1 

Это означает, что набор i равный i+1.

2

Ваша проблема здесь:

i += i+1 

Вы идете по списку слишком быстро. Вы должны сделать это:

i += 1 

Я хотел бы написать код вроде этого:

import operator 

# Return the product of all the digits in `series` converted to integers 
def numprod(series): 
    # Convert the series of digits into a list of integers 
    digits = [int(c) for c in series] 

    # This applies the multiplication operator to all the digits, 
    # starting with 1 
    return reduce(operator.__mul__, digits, 1) 

# Produce every string of length 5 
# This uses a generator but could just as easily use a list comprehension: 
# numiter = [num[i : i + SERIES_SIZE] for i in range(len(num) - SERIES_SIZE + 1)] 
SERIES_SIZE = 5 
numiter = (num[i : i + SERIES_SIZE] for i in range(len(num) - SERIES_SIZE + 1)) 

# Calculate all the products 
allnumprods = [numprod(series) for series in numiter] 

# Find the maximum of all the products 
print max(allnumprods) 

Более простой способ вычисления произведения заключается в следующем:

def numprod(series): 
    product = 1 
    for c in series: 
     product *= int(c) 
    return product 
+2

Я думаю, что новичкам будет сложно найти этот образец :) – Anycorn

+2

Ассистент кажется довольно новым для python, я бы предположил, что ваша версия может быть слишком сложной для обработки. – Joseph

+2

Справедливые комментарии. Я даже выдвину свою критику. Возможно, кто-то другой, задающий вопросы EulerProject, получит что-то из этого ответа. :-) – hughdbrown

9

Были несколько вопросов.

  1. Вы печатали product не biggest. Обязательно распечатайте правильную переменную!

  2. Вы повторяли длину всей строки, когда вы действительно должны просто перебирать диапазон [0..len(num) - 4), чтобы вы не получали IndexError, когда делаете расчеты с вашим продуктом.

  3. Вы увеличивали свою переменную i. Вы хотите увеличить его на 1 каждый ход, чтобы просто сделать i += 1 или i = i + 1. Код i += i + 1 эквивалентен i = i + i + 1. Я не думаю, что вы хотели удвоить i на каждой итерации цикла while. :)

  4. Последовательности индексируются 0 на Python. Это означает, что когда вы повторяете набор индексов, первый элемент всегда находится в seq[0], и элементы продолжаются до seq[n-1]. Поэтому вы должны ввести переменную i в 0, а не 1!

  5. Вы не правильно измерили свое время. Вы хотите, чтобы ваше время start было назначено до того, как будет выполнен весь ваш код, чтобы вы могли правильно измерить elapsed времени.

Вот ваш фиксированный код:

''' 
Find the greatest product of five consecutive digits in the 1000-digit number 
''' 

import time 
start = time.time() 

num = '\ 
73167176531330624919225119674426574742355349194934\ 
96983520312774506326239578318016984801869478851843\ 
85861560789112949495459501737958331952853208805511\ 
12540698747158523863050715693290963295227443043557\ 
66896648950445244523161731856403098711121722383113\ 
62229893423380308135336276614282806444486645238749\ 
30358907296290491560440772390713810515859307960866\ 
70172427121883998797908792274921901699720888093776\ 
65727333001053367881220235421809751254540594752243\ 
52584907711670556013604839586446706324415722155397\ 
53697817977846174064955149290862569321978468622482\ 
83972241375657056057490261407972968652414535100474\ 
82166370484403199890008895243450658541227588666881\ 
16427171479924442928230863465674813919123162824586\ 
17866458359124566529476545682848912883142607690042\ 
24219022671055626321111109370544217506941658960408\ 
07198403850962455444362981230987879927244284909188\ 
84580156166097919133875499200524063689912560717606\ 
05886116467109405077541002256983155200055935729725\ 
71636269561882670428252483600823257530420752963450' 

biggest = 0 
i = 0 
while i < len(num) - 4: 
    one = int(num[i]) 
    two = int(num[i+1]) 
    thr = int(num[i+2]) 
    fou = int(num[i+3]) 
    fiv = int(num[i+4]) 
    product = one*two*thr*fou*fiv 
    if product > biggest: 
     biggest = product 
    i = i + 1 
print(biggest) 

elapsed = (time.time() - start) 
print("This code took: " + str(elapsed) + " seconds") 
+1

Это довольно полный ответ. Он охватывает все ошибки в коде и переписывает код только с перечисленными исправлениями. – hughdbrown

0
import string 
numbers=list() 
fo=open("C:/python34/libs/maths2.txt","r+") 
for eachline in fo: 
    for char in eachline: 
     if char.isdigit(): 
      A=char 
      numbers.append(int(A)) 

print(numbers) 
list1=list() 
for i in range(0,len(numbers)-4): 
    x=numbers[i]*numbers[i+1]*numbers[i+2]*numbers[i+3]*numbers[i+4] 
    list1.append([x]) 
print(list1) 
print(max(list1)) 
+0

Не могли бы вы подробнее рассказать о своем ответе, добавив немного подробного описания вашего решения? – abarisone

0

Можно также использовать функционал программирования для упрощения задачи значительно:

def foo(): 
    max_product = 0 
    num = "string of input number" 
    for e,n in enumerate(num): 
     product = reduce((lambda x,y: x*y),map(int,(num[e:e+13]))) 
     if product > max_product: 
      max_product = product 
    return max_product 

дать ему попробовать!