Найдите количество целых чисел-палиндромов в заданном промежутке (включая границы). JAVA
На вход программы подаются 2 числа в строчке: границы интервала поиска a и b (известно, что a < b).
Найдите количество целых чисел-палиндромов в заданном промежутке (включая границы).
Представлять число в виде строки нельзя, задачу необходимо решить с использованием стандартных арифметических операций.
Требуется решить с помощью джавы.
Ответы (1 шт):
Данную задачу можно решать разными способами, которые будут значительно отличаться по эффективности.
Самое простое, понятное / логичное, но не самое быстрое решение заключается в переборе всех чисел из заданного диапазона с проверкой, является ли такое число палиндромом.
Готовый код не приводится в педагогических целях, будет только описание алгоритма и базовых вещей.
- Понадобится определить метод (функцию), который/ая будет проверять, является ли входное целое число (неотрицательное) палиндромом или нет (условная сигнатура:
static boolean isPalindrome(int n)) - Числа "длиной" 1, т.е. меньшие 10, по определению являются палиндромами. Соответственно, числа от 10 и выше, которые оканчиваются на 0, палиндромами являться не будут.
- Потребуется создать и завести массив
int[] dдля сохранения цифр входного числаn.
Размер такого массива должен быть достаточным, чтобы запомнить все цифры наибольшего 32-битного целого числаInteger.MAX_VALUE= 231 - 1 = 2'147'483'647, то есть, 10 знаков.
Также стоит завести счётчик для длины числа (int len = 0;). - В первом цикле заполняем массив цифр при помощи операции
%(нахождения остатка от деления по модулю 10) и инкрементируем счётчик длины, при этом исходное число последовательно сдвигается вправо на один десятичный разряд (уменьшается) путём деления на 10, пока не останется 0. - Получив массив цифр и вычислив длину исходного числа, во втором цикле проверяем собственно, является ли число палиндромом любым удобным способом, сравнивая цифры в начале и конце числа (индексы
iиlen - 1 - i).
Как только обнаружено расхождение в цифрах, возвращается значениеfalse(не палиндром).
Если цикл завершён до конца (проверены все цифры), возвращаемtrue(найден палиндром).
Затем реализуем второй метод, принимающий на вход два числа a и b, a < b, со счётчиком палиндромов, и вызывающий в цикле от a до b (включительно) предыдущий метод isPalindrome().
Условная сигнатура static int countPalindromes(int a, int b).
В основном методе main обеспечиваем ввод чисел a и b (например при помощи класса java.util.Scanner, у которого есть метод для чтения целых чисел из потока ввода nextInt), вызываем countPalindromes и выводим результаты его работы (System.out.println / System.out.printf).
Пример гораздо более эффективного решения на Питоне без перебора и проверки на палиндромность можно найти в ответе от Станислава Володарского на похожий вопрос Как посчитать количество чисел-палиндромов в большом промежутке?.