Продолжаем разбирать задачки с сайта Leetcode. В прошлый раз было про массив и сумму чисел, теперь тоже необычное.
Условия
В переменной X лежит какое-то целое число
Задача — проверить, является ли это число палиндромом.
Задача со звёздочкой — проверить на наличие палиндрома, не используя строки.
Палиндром — это когда строка или число одинаково читается в прямом и обратном направлении:
121 — это палиндром.
А роза упала на лапу Азора — тоже палиндром (если не считать заглавных букв).
12321 — и это палиндром.
Решение, где используем строки
Самый простой способ проверить, число в переменной палиндром или нет, — преобразовать его в строку, выставить знаки задом наперёд и сравнить с оригиналом. Этим мы сразу решаем проблему отрицательных чисел, когда «−121»превращается в «121−» и сразу становится ясно, что это не палиндром.
Сначала решим это на Python. Тут вообще суть в одной строке:
X = 121 if str(X) == str(X)[::-1]: print(«Это палиндром») else: print(«Это не палиндром»)
Здесь мы использовали трюк с переворачиванием строки без её изменения — применили конструкцию [::-1]. Работает это так:
Математические операции для поиска палиндрома
- Первым параметром указывают начало, откуда начинать обработку строки. Раз ничего не указано, то начинаем с первого символа.
- Второй параметр — на каком по счёту символе надо остановиться. Здесь тоже ничего нет, поэтому алгоритм пройдёт до конца строки.
- Последний параметр — шаг и направление обработки. У нас указана минус единица, значит, алгоритм обработает строку справа налево, на каждом шаге считывая по символу.
- В итоге этот код вернёт нам строку, собранную в обратном порядке, при этом с оригинальной строкой ничего не случится — она останется неизменной.
Программа для проверки, является ли введенное число палиндромом
Программа принимает на вход число и определяет, является ли оно палиндромом.
Решение задачи
- Принимаем число и записываем его значение в переменную.
- Создаем еще одну переменную и помещаем в нее то же самое значение.
- Далее при помощи цикла while мы «переворачиваем» исходное число, то есть находим как оно пишется в обратном порядке. Мы уже решали такую задачу ранее.
- Далее сравниваем полученное число с сохраненной ранее копией первоначального числа. Если они равны, то исходное число — это палиндром.
- Выводим полученный результат на экран.
- Конец.
Исходный код
Ниже дан исходный код для проверки, является ли введенное число палиндромом. Результаты работы программы также даны ниже.
n = int(input(«Введите число:»)) temp = n rev = 0 while(n > 0): dig = n % 10 rev = rev * 10 + dig n = n // 10 if(temp == rev): print(«Это палиндром!») else: print(«Это не палиндром!»)
Объяснение работы программы
- Пользователь вводит число и оно записывается в переменную n .
- Затем это же число дублируется в переменную temp .
- Далее при помощи уже разобранной нами процедуры число n записывается в обратном порядке и сохраняется в переменной rev .
- Затем это число (находящееся в переменной rev ) сравнивается с сохраненной нами ранее копией введенного числа (которая находится в переменной temp ).
- Если эти числа равны, то исходное число является палиндромом.
- В противном случае оно палиндромом не является.
- В завершении мы выводим конечный результат на экран.
Результаты работы программы
Пример 1 Введите число:121 Это палиндром! Пример 2 Введите число:567 Это не палиндром!
Примечание переводчика
Как и в прошлом примере, при помощи методов строк эту задачу можно решить гораздо короче. Предоставим читателям самим это сделать.
Задача Палиндром на Python (Питон): 10+ вариантов решений
Источник: pythonist.ru
Дано натуральное n. Определить, является ли это число палиндромом
Вот мой код, но я не знаю, что делать дальше. Как мне дописать этот код, не используя массивы, указатели, строки и тому подобное. Эта задача должна решаться как-то с помощью цикла.
#include #include #include using namespace std; int main() < setlocale(0, «rus»); int n, sum(0); double i(0.0); begin: cout > n; if (n < 0) goto begin; int copy_n1 = n; while (copy_n1 >0) < copy_n1 /= 10; ++i; >int copy_n2 = n; const int copy_i = i; for (int k = 0; k < copy_i; ++k) < i -= 1.0; double a = pow(10.0, i); int y = copy_n2 % int(a); /////// а дальше я не знаю, как делать >cout
Отслеживать
13.6k 12 12 золотых знаков 43 43 серебряных знака 72 72 бронзовых знака
задан 1 ноя 2018 в 17:50
user314318 user314318
Вы человеческими словами можете описать, как это определить?
– user176262
1 ноя 2018 в 17:54
Число 10 является палиндромом ( 010 ) или не является?
1 ноя 2018 в 18:04
да читайте вы число как строку и всё. работы в разы меньше.
1 ноя 2018 в 18:13
– user176262
1 ноя 2018 в 18:14
1 ноя 2018 в 18:15
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Желательно использовать рекурсивную функцию. Для упрощения решения проблемы можно использовать строковое представление данных. Предлагаю вариант использования нерекурсивной функции, данную вещь можно просто в main использовать.
#include using namespace std; int reverse_number(int number) < int n = 0; while(number) < n = 10*n + number%10; number /= 10; >return n; > int main() cout > number; if (number == reverse_number(number)) cout
не забудь прописать setlocate и так далее.
Совет
не используй go to — усложняет восприятие кода и качество кода, посторайся обходится без него
Источник: ru.stackoverflow.com