Python

Задача на питоне.!

Натуральное число называется палиндромом, если его запись в десятичной системе счисления читается слева направо также, как и справа налево. По данному натуральному числу N определите следующее за ним натуральное число (то есть наименьшее число, которое превосходит N), являющееся палиндромом.

Формат входного файла

Программа получает на вход одно натуральное число N, состоящее не более чем из 200 цифр.

Формат выходного файла

Программа должна вывести наименьшее натуральное число, которое больше N и является палиндромом.

Примеры
Ввод
4321
Вывод

4334
Еще вариант.
"""
Проверяем от центра влево и вправо, зеркальные.
Если находим пару, у которой левая меньше правой,
или если обе половины равны,
~~~~то увеличиваем на единицу средние одну или две цифры.
~~~~а остальные правые меняем на отзеркаленную левую
12 3 41 - 12 4 21
123456 655321 - 123457 754321

Если находим пару, у которой левая цифра больше правой,
~~~~то начиная с этой цифры правой половине присвоим левую отзеркалив
12317 - 12321
"""
from timeit import default_timer as timer

#s = input()
#n = 1234321#int(input())
n = int('1234598754411128'*1000)
start = timer()
s = str(n)
s = list(s)
odd = len(s)%2# 1 - если нечетное количество цифр
hs = (len(s)+1)//2#половина
sl = s[hs-1::-1]#левая половина от средины к началу
sr = s[hs:]# правая половина от средины к концу

if sl[odd:] <= sr:
~~~~sl[0] = chr(ord(sl[0])+1)
~~~~sr = sl
else:
~~~~fl = 1
~~~~for i,a in enumerate(sl[odd:]):
~~~~~~~~if fl:
~~~~~~~~~~~~if sl[i+odd] > sr[i]:
~~~~~~~~~~~~~~~~fl = 0
~~~~~~~~if not fl:
~~~~~~~~~~~~sr[i] = sl[i+odd]
res = ''.join(sl[::-1] + sl[odd:])
print(res)
end = timer()
print(end - start)

PS
Лишнее сами уберите.
Sasori Acasuno
Sasori Acasuno
21 729
Лучший ответ
Sasori Acasuno Досмотрел, что половина строк лишние (имею в виду не вспомогательных, типа таймера, а осноных)

По-моему так лучше:
s = input()
s = list(s)
odd = len(s)%2# 1 - если нечетное количество цифр
hs = (len(s)+1)//2#половина
sl = s[hs-1::-1]#левая половина от средины к началу
sr = s[hs:]# правая половина от средины к концу

if sl[odd:] <= sr: sl[0] = chr(ord(sl[0])+1)
res = ''.join(sl[::-1] + sl[odd:])
print(res)
Сергей Малокуцкий Программа выдаёт ошибку в процессе выполнения
Сергей Малокуцкий при числе 4554 выдаёт 4664 хоть число 4554 это палиндром
Сергей Малокуцкий а нет, числа правильные но на сайте ошибку выдёт
Сергей Малокуцкий Программа выдаёт ошибку в процессе выполнения
Евгений Воронков ок надеюсь не забудешь
не думай о числе как о числе...
думай как о строке...
берёшь первую поливину строки, и пришиваешь к ней эту же половину, но развёрнутую наоборот... всё...

если число букв нечётное, то оставляешь средню.. букву где стояла...

сомнения?

берите тогда ЧИСЛО... в 200 цифр... и делайте...
Алексей Степанов Выдыхайте, уважаемый.
Сергей Малокуцкий Если можете, то напишите код пожалуйста
Александр Попов это так не работает)
Интересно. Есть какие-то варианты алгоритмов?
Я эту фигню нашим программерам дам..
Андрей Ш
Андрей Ш
1 427
n = int(input())
k = 0
while True:
----n=int(n)+1
----b=str(n)[-1::-1]
----if str(n)==b:
--------break
print(n)

На питоне, работает. Могу ещё C# скинуть если хочешь
Sasori Acasuno "На питоне, работает. "

И за какое время у Вас обрабатывается 200 циферное число? Которое в условии.
Сергей Малокуцкий пишет что долго обрабатывается
Сергей Малокуцкий выполняется*