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

Я так решил.

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

  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.

      Удалить
    2. Братан, очень круто, но есть одна загвоздка: у меня ещё более крутой рекорд 580085
      num1 = 100
      list_num = []
      list_ = []
      list_polindrom = []
      for i in range(100,1000):
      list_num.append(i)

      for global_iteration in list_num:
      for x in list_num:
      sum_num = num1 * x
      list_.append(sum_num)
      else:
      num1 += 1

      for a in list_:
      string = str(a)
      revers = string[::-1]
      if string == revers:
      list_polindrom.append(string)
      print(list_polindrom[-1:])

      Удалить
  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. Этот комментарий был удален автором.

    ОтветитьУдалить
  7. x = []
    for i in range(100,1000):
    for n in range(100,i):
    b = str(n*i)

    if len(b) == 6 and b[0] == b[5] and b[1] == b[4] and b[2] == b[3]:
    x.append(b)
    x.sort()
    print(x[-1])

    ОтветитьУдалить
  8. У меня вышло вот так:

    from itertools import combinations

    a = 100
    b = []
    c = []
    while a < 1000:
    b.append(a)
    a += 1

    d = combinations(b, 2)
    for i in d:
    num = i[0] * i[1]
    reversed_num = str(num)
    reversed = reversed_num[::-1]
    if reversed == str(num):
    c.append(num)

    print(f'Максимальное число-палиндром двухзначных чисел - {c[-1]}')

    ОтветитьУдалить
  9. def pls():
    for y in range(1000000):
    a = str(y // 1000 * y % 1000)
    if a == a[::-1]:
    yield x * y
    print(max(list(pls())))

    ОтветитьУдалить
  10. n1 = []
    for i in range(100, 1000):
    for o in range(100, 1000):
    n = o * i
    if n / 100000 > 1:
    a = n // 1 % 10
    b = n // 10 % 10
    e = n // 100 % 10
    f = n // 1000 % 10
    c = n // 10000 % 10
    d = n // 100000 % 10
    if a == d and b == c and e == f:
    n1.append(n)
    print(max(n1))

    ОтветитьУдалить
  11. Не самое быстрое, но в одну строчку
    print(*max([[i*j for j in range(100, 999) if str(i*j) == str(i*j)[::-1]] for i in range(100, 999)]))

    ОтветитьУдалить
  12. You all have very interesting solutions.I even couldn`t think about something like that.I made it in 7 rows,but you all have very interesting solutions.I even couldn`t think about something like that.
    palindroms = []
    for i in range(100,1000):
    for x in range(100,1000):
    a = str(x * i)
    if a == a[::-1]:
    palindroms.append(int(a))
    print(max(palindroms))

    ОтветитьУдалить
  13. m_vozr = list(range(100*100,999*999))
    m_vozr.reverse()
    i = 0
    while i < len(m_vozr):
    s = list(str(m_vozr[i]))
    if s[0] == s[5] and s[1] == s[4] and s[2] == s[3]:
    print("Полиндром")
    print(s)
    break
    i+=1

    ОтветитьУдалить
  14. palindroms = []
    for i in range (1,1000):
    for j in range (1,1000):
    c = i*j
    s = str(c)
    k=s[::-1]
    if s==k:
    palindroms.append(c)
    print(max(palindroms))

    ОтветитьУдалить
  15. Мой вариант решение:
    num1 = 999
    list_num = []
    list_ = []
    list_polindrom = []
    for i in range(100,1000):
    list_num.append(i)

    for global_iteration in range(10):
    for x in list_num:
    sum_num = num1 * x
    list_.append(sum_num)
    num1 -= 1

    for a in list_:
    string = str(a)
    revers = string[::-1]
    if string == revers:
    list_polindrom.append(string)
    print(max(list_polindrom))

    ОтветитьУдалить
  16. #это моё решение данной задачи!
    a = []

    for num1 in range(100, 1000):
    for num2 in range(100, 1000):
    num = num1 * num2
    num_rev = ''.join(reversed(str(num)))
    if num == int(num_rev):
    a.append(int(num_rev))
    print(max(a))

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