一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。
本题要求判断一个五位正整数是否为回文数,即该数从左到右读和从右到左读完全相同。
原参考代码的思路是:
将输入的五位数按位拆解,存入数组 a(从高位到低位);
将数组 a 复制到数组 b;
比较 a[i] 与 b[4−i] 是否相等(即正序与逆序对应位是否一致);
若全部相等,则为回文数。
但该实现存在若干问题:
使用 Math.pow(10, i) 进行位提取效率低且易引入浮点误差;
数组 b 的复制是冗余的,可直接用 a[i] 与 a[4−i] 比较;
输入验证仅一次重试,不符合健壮性要求;
变量命名不清晰(如 is 应为 isPalindrome);
未处理非数字输入或多次错误输入的情况。
实际上,对于固定五位数,只需比较:
第 1 位(万位) == 第 5 位(个位)
第 2 位(千位) == 第 4 位(十位)
中间第 3 位(百位)无需比较。
请输入一个五位数:12321
是一个回文数!请输入一个五位数:12345
不是回文数。请输入一个五位数:1221
错误:必须是五位数(10000~99999)!
12321
是一个回文数!对于一个五位数(其中 表示第 位数字),其为回文数当且仅当:
无需关心(中间位)。
更通用地,对任意长度的回文数,满足:
import java.util.Scanner;
public class PalindromeChecker {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long num;
// 循环输入直到合法五位数
while (true) {
System.out.println("请输入一个五位数:");
if (!in.hasNextLong()) {
System.out.println("输入无效,请输入数字!");
in.next(); // 清除非法输入
continue;
}
num = in.nextLong();
if (num >= 10000 && num <= 99999) {
break;
} else {
System.out.println("错误:必须是五位数(10000~99999)!");
}
}
// 方法1:字符串法(简洁直观)
String s = String.valueOf(num);
boolean isPalindrome = true;
for (int i = 0; i < s.length() / 2; i++) {
if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {
isPalindrome = false;
break;
}
}
// 方法2:纯数学法(无字符串)
/*
long temp = num;
int[] digits = new int[5];
for (int i = 4; i >= 0; i--) {
digits[i] = (int)(temp % 10);
temp /= 10;
}
isPalindrome = (digits[0] == digits[4]) && (digits[1] == digits[3]);
*/
if (isPalindrome) {
System.out.println(num + " 是一个回文数!");
} else {
System.out.println(num + " 不是回文数。");
}
}
}
回文数是一类具有对称性质的数字,在密码学、数据校验、趣味数学中常见。
本题限定五位数,但方法可推广至任意位数。
字符串法代码简洁,适合快速开发;数学法则节省内存,适合性能敏感场景。
原题出自经典编程练习集,常用于训练数组操作、循环控制、逻辑判断等基础能力。