Найдите количество целых чисел-палиндромов в заданном промежутке (включая границы). JAVA

На вход программы подаются 2 числа в строчке: границы интервала поиска a и b (известно, что a < b).

Найдите количество целых чисел-палиндромов в заданном промежутке (включая границы).

Представлять число в виде строки нельзя, задачу необходимо решить с использованием стандартных арифметических операций.

Требуется решить с помощью джавы.


Ответы (1 шт):

Автор решения: Nowhere Man

Данную задачу можно решать разными способами, которые будут значительно отличаться по эффективности.

Самое простое, понятное / логичное, но не самое быстрое решение заключается в переборе всех чисел из заданного диапазона с проверкой, является ли такое число палиндромом.

Готовый код не приводится в педагогических целях, будет только описание алгоритма и базовых вещей.

  1. Понадобится определить метод (функцию), который/ая будет проверять, является ли входное целое число (неотрицательное) палиндромом или нет (условная сигнатура: static boolean isPalindrome(int n))
  2. Числа "длиной" 1, т.е. меньшие 10, по определению являются палиндромами. Соответственно, числа от 10 и выше, которые оканчиваются на 0, палиндромами являться не будут.
  3. Потребуется создать и завести массив int[] d для сохранения цифр входного числа n.
    Размер такого массива должен быть достаточным, чтобы запомнить все цифры наибольшего 32-битного целого числа Integer.MAX_VALUE = 231 - 1 = 2'147'483'647, то есть, 10 знаков.
    Также стоит завести счётчик для длины числа (int len = 0;).
  4. В первом цикле заполняем массив цифр при помощи операции % (нахождения остатка от деления по модулю 10) и инкрементируем счётчик длины, при этом исходное число последовательно сдвигается вправо на один десятичный разряд (уменьшается) путём деления на 10, пока не останется 0.
  5. Получив массив цифр и вычислив длину исходного числа, во втором цикле проверяем собственно, является ли число палиндромом любым удобным способом, сравнивая цифры в начале и конце числа (индексы 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).


Пример гораздо более эффективного решения на Питоне без перебора и проверки на палиндромность можно найти в ответе от Станислава Володарского на похожий вопрос Как посчитать количество чисел-палиндромов в большом промежутке?.

→ Ссылка