Ошибка в Java: проверка числа на палиндром как исправить
Разбор ошибки в программе число палиндром на Java: почему num становится 0 и сравнение ложно. Исправленный код с сохранением original, обработкой отрицательных чисел, избежанием overflow. Примеры и тесты для палиндром java.
В чём ошибка в моей Java-программе для проверки, является ли число палиндромом? Как исправить код?
Я пытаюсь написать программу на Java, которая проверяет, является ли заданное число палиндромом (число читается одинаково слева направо и справа налево, например, 121 или 1331).
Вот мой код, но для некоторых входных данных он выдаёт неверный результат: всегда выводит «Not a palindrome number», даже если число является палиндромом.
import java.util.Scanner;
public class PalindromeNumber {
public static void main(String[] args) {
int num, rev = 0;
Scanner sc = new Scanner(System.in);
System.out.print("Enter a number: ");
num = sc.nextInt();
while (num != 0) {
int rem = num % 10;
rev = rev * 10 + rem;
num /= 10;
}
if (num == rev) {
System.out.println("Palindrome number");
} else {
System.out.println("Not a palindrome number");
}
}
}
Логика реверса числа кажется правильной, но сравнение не работает. Объясните, в чём проблема, и покажите, как исправить код. Также приветствуются предложения по улучшению программы (например, обработка отрицательных чисел, закрытие Scanner и т.д.).
Ошибка в вашей программе для проверки, является ли число палиндромом, кроется в цикле while: после него num всегда равен 0, так что сравнение num == rev ложно даже для палиндромов вроде 121. Чтобы исправить, сохраните копию оригинального числа перед реверсом — это стандартный приём в программах число палиндром на Java. Получится простой и надёжный код, который правильно определяет палиндром java для положительных чисел, а с доработками обработает и отрицательные.
Содержание
- В чём ошибка в программе проверки числа на палиндром
- Как исправить код: правильная программа число палиндром на Java
- Логика реверса числа: является ли число палиндромом
- Обработка отрицательных чисел и нулевого ввода
- Альтернативные методы проверки без полного реверса
- Улучшения программы: избежание переполнения и ресурсы
- Примеры тестов и распространённые ошибки
- Источники
- Заключение
В чём ошибка в программе проверки числа на палиндром
Давайте разберём ваш код построчно. Вы вводите число, скажем 121. Цикл while(num != 0) берёт остаток rem = 1, rev становится 1, num = 12. Затем rem = 2, rev = 12, num = 1. Наконец rem = 1, rev = 121, num = 0. Всё правильно реверсировано! Но вот засада: if (num == rev) проверяет 0 == 121. Конечно, ложно. “Not a palindrome number” — и для любого числа.
Почему так? Num мутирует в цикле. Логика реверса верна, но оригинал стёрт. Это классическая ловушка новичков в задачах вроде “программа проверить является ли число палиндромом”. На Stack Overflow на русском ту же ошибку разбирали: сохраните копию до цикла.
Коротко: проблема не в реверсе, а в сравнении. Исправим за минуту.
Как исправить код: правильная программа число палиндром на Java
Вот минимальное исправление. Добавляем int original = num; перед циклом. Сравниваем original == rev.
import java.util.Scanner;
public class PalindromeNumber {
public static void main(String[] args) {
int num, rev = 0, original;
Scanner sc = new Scanner(System.in);
System.out.print("Enter a number: ");
num = sc.nextInt();
original = num; // Сохраняем оригинал!
while (num != 0) {
int rem = num % 10;
rev = rev * 10 + rem;
num /= 10;
}
if (original == rev) {
System.out.println("Palindrome number");
} else {
System.out.println("Not a palindrome number");
}
sc.close(); // Хорошая практика
}
}
Тестируем: 121 → rev=121, original=121 → “Palindrome number”. 123 → rev=321 !=123 → верно. Готово! Это базовая программа число палиндром, как в примерах на Progi.pro.
Но подождите, а если число большое? Или отрицательное? Давайте углубимся.
Логика реверса числа: является ли число палиндром
Как работает реверс? Берем число палиндром, например 1331.
- num=1331, rem=1, rev=1, num=133
- rem=3, rev=13, num=13
- rem=3, rev=133, num=1
- rem=1, rev=1331, num=0
Сравниваем с оригиналом — да, палиндром. Это O(d) по цифрам d, эффективно для int (до 10 цифр).
Почему не строки? String.valueOf(num).equals(new StringBuilder(…).reverse().toString()) проще, но для “чистого” алгоритма — числа лучше. На Guru99 показывают те же шаги: lastDigit = a % 10, sum *=10 + lastDigit.
А вы знали? 0 — палиндром. 10 — нет (01 !=10). Логика надёжна для натуральные числа палиндромы.
Обработка отрицательных чисел и нулевого ввода
Ваш код сломается на -121: реверс даст 121, но original=-121 !=121. Отрицательные — не палиндромы по определению (читается “-121” vs “121-”).
Решение: if (num < 0)
0? Да, палиндром (читается одинаково).
Полный вариант:
if (num < 0) {
System.out.println("Not a palindrome number (negative)");
return;
}
if (num == 0) {
System.out.println("Palindrome number");
return;
}
Так проверка числа на палиндром учитывает edge-кейсы. Как советуют на Techie Delight.
Альтернативные методы проверки без полного реверса
Реверс хорош, но для палиндром java есть хитрости без него. Сравниваем цифры с концов.
Пример для 4-значного: левая = num / 1000, правая = num % 10. Середина аналогично.
Общий алгоритм: найдите цифр log10(num)+1, сравните i-ю и (d-i+1)-ю.
public static boolean isPalindrome(int num) {
if (num < 0) return false;
int original = num;
int reversed = 0;
while (num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return original == reversed;
}
Или “двухпалатный” указатель: реверсируем половину. Для нечётных — пропускаем середину. Эффективнее для строк, но для чисел реверс проще.
Выбор? Реверс — для новичков. Половина — для больших чисел.
Улучшения программы: избежание переполнения и ресурсы
Int — до 2^31-1 (~10 цифр). 1000000001 реверснет с overflow (rev*10 > INT_MAX).
Фикс: long rev = 0L; num как int, но проверка if (rev > Integer.MAX_VALUE) false.
Scanner: не забудьте sc.close(), но лучше try-with-resources (Java 7+).
public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
System.out.print("Enter a number: ");
int num = sc.nextInt();
if (isPalindrome(num)) {
System.out.println("Palindrome number");
} else {
System.out.println("Not a palindrome number");
}
}
}
Метод isPalindrome отдельно — чистый код. Нет утечек, нет overflow. Идеально для программы является ли число палиндромом.
Ещё: валидация ввода try-catch для non-int.
Примеры тестов и распространённые ошибки
Тесты:
- 121 → Yes
- 123 → No
- 0 → Yes
- -121 → No
- 1001 → Yes
- 1000000001 → Проверьте на long!
Ошибки:
- Забыли original.
- Отрицательные.
- Overflow — используйте long.
- Ведущие нули в строках (но для чисел нет).
Запустите в IDE, поэкспериментируйте. Как проверить является ли число палиндромом? Теперь знаете.
Источники
- Stack Overflow на русском — Обсуждение ошибки в проверке числа палиндромом с сохранением original: https://ru.stackoverflow.com/questions/1232280/Проверка-на-полиндром
- Progi.pro — Пример программы число палиндром на Java с реверсом: https://progi.pro/chisla-palindroma-v-java-6462448
- Guru99 — Шаги реверса числа для palindrome program на Java: https://www.guru99.com/ru/java-palindrome-program.html
- Techie Delight — Определение палиндрома числа без строк и обработка отрицательных: https://www.techiedelight.com/ru/determine-given-number-palindrome-not/
Заключение
Теперь ваша программа проверка на палиндром работает идеально: сохраняйте оригинал, используйте long, try-with-resources — и никаких сюрпризов. Это не только фиксит ошибку, но и делает код production-ready. Попробуйте на палиндром четырехзначного числа вроде 1221 — сработает на ура. Если кодите дальше, помните: тестируйте edge-кейсы, они ловят 80% багов. Удачи с Java!
Основная ошибка в вашем коде — сравнение num == rev происходит после цикла, когда num уже равно 0. Нужно сохранить оригинальное значение числа в отдельной переменной original до реверса.
Правильный алгоритм для палиндром java:
int original = num;- В цикле
while (num > 0):int rem = num % 10; rev = rev * 10 + rem; num /= 10; - Сравнить
original == rev.
int original = num;
while (num > 0) {
int rem = num % 10;
rev = rev * 10 + rem;
num /= 10;
}
if (original == rev) { /* палиндром */ }
Альтернативы: сравнение цифр с концов с Math.pow(10, degree), или по log10 для длины. Тестируйте на 121 (да) и 123 (нет), используйте long для избежания переполнения.
В программе число палиндром на Java сохраните копию ввода: int n = num. Затем реверсируйте в цикле while (num > 0):
int rmd = num % 10;rev = rev * 10 + rmd;num /= 10;
Сравните if (rev == n). Пример: для 121 выводит “is a Palindrome Number!”. Это стандартный метод программы проверить является ли число палиндромом без строк, подходит для натуральных чисел палиндромы с Scanner.
Программа является ли число палиндромом использует цикл while для реверса: lastDigit = a % 10; sum = (sum * 10) + lastDigit; a /= 10. Сохраните inputNumber как оригинал, сравните с sum после.
Пример для 171:
- Шаги реверса показывают палиндром java.
- Вывод: “Number is palindrome”.
Подходит для проверки числа на палиндром, но для больших чисел используйте long во избежание переполнения int.
Чтобы определить, является ли число палиндромом, реверсируйте с %10 и /10, сравните с оригиналом. Примеры: 16461 — rev == original (да), 1234 — нет.
- Обработайте отрицательные как не-палиндром (
Math.absилиfalse). - Избегайте переполнения
intсlong.
Базовый алгоритм число палиндром для Java и других языков, идеален для натуральные числа палиндромы.