2014-09-30 2 views
0

Таким образом, вопрос требует найти самый большой продукт из тринадцати последовательных целых чисел в массивном целые числа. Я просмотрел некоторые из других решений SO, но никто из них не работает так же, как мое предлагаемое решение.Project Euler Number 8 Python

from numpy import product 
def function(): 
    x=#massive integer goes here, x is a string which I then turn into a list. 
    my_list=[] 
    for i in x: 
     my_list.append(int(i)) 
    j=0 
    while j+12 < len(my_list): 
     answer=long(0) 
     my_slice=my_list[j:(j+12)] 
     test=long(product(my_slice)) 
     if test>answer: 
      answer=test 
      j+=1 
     else: 
      j+=1 
     return answer 

Этот кусок кода возвращает 1666980L, который на несколько порядков величины, но я не вижу своей ошибки.

+3

Вы отделили свой «ответный ответ», поэтому он находится внутри цикла while. Это означает, что вы попробуете первые 13 чисел, получите '1666980L', а затем просто« верните », чтобы ничего не попробовать. – abarnert

+1

Кроме того, если ни один из индексов не является отрицательным или не ограниченным, 'lst [a: b]' всегда будет иметь элементы 'b-a' (поскольку исключается' lst [b] '). 'my_list [j: j + 12]', таким образом, слишком короткий элемент. – jwodder

+1

Несколько примечаний к этому коду: Если вы не используете древнюю версию (2.3? I forget ...) Python, не используйте 'long (...)' all over place; просто используйте 'int', и он будет переполняться до' long' автоматически по мере необходимости. Если вы используете _are_ с использованием древней версии, ваш код ошибочен; к тому времени, когда «продукт» был усечен или что-то еще, слишком поздно преобразовать его в 'long'; вам нужно сначала сохранить значения «long» в списке, после чего «длинные (...)» преобразования снова станут ненужными. – abarnert

ответ

1

Здесь меньше всего проблем.

Во-первых, как указано в комментарии abarnert, вы отступили от своего ответного ответа, так что он находится внутри цикла while. Это означает, что вы попробуете первую партию чисел, получите 1666980L, а затем просто вернетесь, не пробовав ничего.

Во-вторых, как jwodder указал в комментарии, [j:j+12] - это фрагмент из 12 цифр, а не 13. Слайды, диапазоны и т. Д. В Python все полуоткрыты, что означает, что они включают все с самого начала, вплоть до не включая конец. Итак, вам нужно [j:j+13].

+0

Поскольку люди настаивают на ответе на этот вопрос, а не на его закрытии, я создал ответ сообщества-вики, ссылаясь на два комментария, которые выявили проблемы на 2 часа раньше, позволяя ассеру исправить свой код до того, как какой-либо из ответов был даже отправлен , – abarnert

-1

слайс не 13 длинный срез питон обозначения [т: п), последний индекс исключен, поэтому для необходимо учитывать, добавив один на слайс т.е.

my_slice=my_list[j:(j+12)]