Наибольшее произведение-палиндром
Число-палиндром с обеих сторон (справа налево и слева направо) читается одинаково. Самое большое число-палиндром, полученное умножением двух двузначных чисел – 9009 = 91 × 99.
Найдите самый большой палиндром, полученный умножением двух трехзначных чисел.
Чтобы решить эту задачку мне пришлось схитрить. Во первых, я спросил у Гугла какой именно палиндром мне надо найти. Гугл сказал что это 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])
Я так решил.
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
Вот мое решение, вроде попроще
Этот комментарий был удален автором.
ОтветитьУдалить
ОтветитьУдалить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)
эм я нашел вроде число по больше 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)
К сожалению, вы не правы. Ваш код находит максимальный палиндром меньший произведения чисел 999*999. Правильный ответ 906609.
УдалитьБратан, очень круто, но есть одна загвоздка: у меня ещё более крутой рекорд 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:])
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)
Этот комментарий был удален автором.
ОтветитьУдалить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])
У меня вышло вот так:
ОтветитьУдалить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]}')
def pls():
ОтветитьУдалитьfor y in range(1000000):
a = str(y // 1000 * y % 1000)
if a == a[::-1]:
yield x * y
print(max(list(pls())))
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))
Не самое быстрое, но в одну строчку
ОтветитьУдалитьprint(*max([[i*j for j in range(100, 999) if str(i*j) == str(i*j)[::-1]] for i in range(100, 999)]))
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))
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
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))
Мой вариант решение:
ОтветитьУдалить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))
#это моё решение данной задачи!
ОтветитьУдалить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))