Проект Эйлера - Задача 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])

Я так решил.

7 комментариев:

  1. a = 999
    b = 999
    x = True
    while x:
    c = a*b
    c = str(c)
    print(c)
    if c[0] == c[5] and c[1] == c[4] and c[2] == c[3]:
    print ('Да это палиндром')
    x = False
    else:
    if a==b:
    a = a-1
    elif a > b:
    a = a -1
    else:
    b= b-1
    Вот мое решение, вроде попроще

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить

  3. list1 = []
    for j in range(100,1000):
    for i in range(100,1000):
    list1.append(i * j)
    poly = []
    for x in list1:
    to_str = str(x)
    if to_str == to_str[::-1]:
    poly.append(to_str)
    to_int = []
    for x in poly:
    to_int.append(int(x))
    max(to_int)

    ОтветитьУдалить
  4. эм я нашел вроде число по больше 997799

    a = str(999 * 999)

    while True:
    b = a[0]
    c = a[len(a) - 1]
    d = a[1]
    e = a[len(a) - 2]
    a1 = a[2]
    a2 = a[len(a) - 3]
    if b == c and d == e and a1 == a2:
    print(a)
    break
    else:
    a = int(a)
    a -= 1
    a = str(a)

    ОтветитьУдалить
    Ответы
    1. К сожалению, вы не правы. Ваш код находит максимальный палиндром меньший произведения чисел 999*999. Правильный ответ 906609.

      Удалить
  5. a1 = 999
    aMin = 100
    polindrom = 0
    while a1 > aMin:
    a2 = a1
    while a2 > aMin:
    pol = a1 * a2
    if str(pol) == str(pol)[::-1] and pol > polindrom:
    polindrom = pol
    aMin = a2
    break
    a2 -= 1
    a1 -= 1
    print(polindrom)

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить