2013-12-20 7 views
0

Я пытаюсь решить проблему 4 в проекте Эйлера, который:петля заканчивается без причины

палиндромного числа читается одинаково в обоих направлениях. Самый большой палиндром, изготовленный из продукта двух двузначных чисел, составляет 9009 = 91 × 99. Найти самый большой палиндром из продукта двух трехзначных чисел.

Исходный код, который я написал это:

def check_reversed(number): 
    number = str(number) 
    if number == number[::-1]: 
     return True 

for x in range(100,1000): 
    for y in range(100,1000): 
     if check_reversed(x*y) == True: 
      print x,y,x*y 

По какой-то причине второй цикл останавливается на номер 583 и выдает неправильный ответ. Когда я изменяю диапазон, хотя второго цикла «для» (584,1000), он выводит правильный ответ. Мой вопрос: почему вторая петля заканчивается на номер 583?

EDIT: РЕШИТЬ: (Спасибо за вашу помощь!)

def check_reversed(number): 
    number = str(number) 
    return number == number[::-1] 

max_pal = 0 
for x in range(100,1000): 
    for y in range(100,1000): 
     if check_reversed(x*y) == True: 
      if x*y > max_pal: 
       max_pal = x*y 

print max_pal 
+0

вас может уменьшить 'check_reversed', чтобы' return number == number [:: - 1] 'вместо использования' if' .. –

+1

Возможно, вы получаете ответ палиндрома, но не самый большой. Но это странно, что он останавливается ... –

+0

Не используйте '== True' в тесте' if'; это то, что 'if' ** для **. –

ответ

10

Ваш второй цикл не заканчивается 583 вообще; 583 просто самый высокий yдля x = 995 Это палиндром.

Две линии раньше, ваш код печатает:

993 913 906609 

, которые явно противоречат анализа.

Вы должны отслеживать максимальный результат и не предполагают, что максимальная x дает ответ.

Обратите внимание на то, что при тестировании одинаковых номеров для y имеется небольшая точка; нет необходимости тестировать продукт range(100, 1000), когда комбинации будут делать:

from itertools import combinations 

def check_reversed(x, y): 
    number = str(x * y) 
    return number == number[::-1] 

x, y = max((c for c in combinations(range(100, 1000), r=2) if check_reversed(*c)), 
      key=lambda c: c[0] * c[1]) 
print x, y, x * y 
+0

В один из этих выходных мне нужно провести сеанс хруста, изучая' itertools'. Я отправил один лайнер выше, но он медленный, как crud, так как он запускает 808,201 умножений и 1,616,402 строк и строит список из 800 000 кортежей. Itertools будет намного быстрее. –

+0

@adsmith: вы также попадаете в ловушку продукта; вам нужно только протестировать уникальные комбинации; например меньше половины. –

+0

Правда! И если честно, если самый большой палиндром как продукт 3-значных чисел был идеальным квадратом, 'itertools.combinations' не найдут его! 'print (" {product [1]} * {product [2]} == {product [0]} ". format (product = max ([(x * y, x, y) для x в диапазоне (100, 1000) для y в диапазоне (x, 1000), если str (x * y) == str (x * y) [:: - 1]]))) 'IS невероятно быстрее. –

0

ваши петли просто работать нормально, потому что последние две цифры в ваших условиях являются 995 583 однако этот сценарий решает проблему

def check_reversed(number): 
    number = str(number) 
    if number == number[::-1]: 
     return True 

temp = 0 

for x in range(100,1000): 
    for y in range(100,1000): 
     if check_reversed(x*y) and temp <= x*y: 
      temp = x * y 
      print x,y,x*y 
Смежные вопросы