Проект Эйлера - Задача 4



Наибольшее произведение-палиндром

Число-палиндром с обеих сторон (справа налево и слева направо) читается одинаково. Самое большое число-палиндром, полученное умножением двух двузначных чисел – 9009 = 91 × 99.

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

Моё решение (Python) под катом:

Чтобы решить эту задачку мне пришлось схитрить. Во первых, я спросил у Гугла какой именно палиндром мне надо найти. Гугл сказал что это 906609. Во вторых я хотел написать алгоритм который решает только данную задачу. Потому что я хочу попробовать разные возможности Питона.

В начале я задаю переменный. Было интересно поработать с листами.
num1 = 999 num2 = 999 polist = list() i = 0

Затем я написал код который проверяет именно 6-и значные палиндромы. Другие меня не интересуют. Последняя строка самая интересная. Она превращает цифра в строку, переписывает их в обратном направлении и затем возвращает их как цифры. Это очень круто!! Не надо мучаться с разными форами и дополнительными переменными.
pol = num1 * num2 pol1 = pol // 1000 pol2 = pol % 1000 revpol2 = int(str(pol2)[::-1])

Затем сама проверка. И если число таки является палиндромом то оно будет записано в лист.
if pol1 == revpol2 and pol > 100000: polist.insert(i, pol) i += 1 num1 -= 1 if num1 < 316: num1 = 999 num2 -= 1

Затем сортируем лист от большего к меньшему и выдаем первое значение из листа. Коим и оказалось 906609. Значит мой алгоритм таки решил поставленную задачу.
polist.sort(reverse=True) print(polist[0])

Весь код целиком.
num1 = 999 num2 = 999 polist = list() i = 0 while num2 > 316: pol = num1 * num2 pol1 = pol // 1000 pol2 = pol % 1000 revpol2 = int(str(pol2)[::-1]) if pol1 == revpol2 and pol > 100000: polist.insert(i, pol) i += 1 num1 -= 1 if num1 < 316: num1 = 999 num2 -= 1 polist.sort(reverse=True) print(polist[0])

Я так решил.

Комментариев нет:

Отправка комментария