源本科技 | 码上会

回文数判断

2026/02/04
18
0

题目

一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。

说明

本题要求判断一个五位正整数是否为回文数,即该数从左到右读和从右到左读完全相同。

原参考代码的思路是:

  1. 将输入的五位数按位拆解,存入数组 a(从高位到低位);

  2. 将数组 a 复制到数组 b

  3. 比较 a[i]b[4−i] 是否相等(即正序与逆序对应位是否一致);

  4. 若全部相等,则为回文数。

但该实现存在若干问题:

  • 使用 Math.pow(10, i) 进行位提取效率低且易引入浮点误差;

  • 数组 b 的复制是冗余的,可直接用 a[i]a[4−i] 比较;

  • 输入验证仅一次重试,不符合健壮性要求;

  • 变量命名不清晰(如 is 应为 isPalindrome);

  • 未处理非数字输入或多次错误输入的情况。

实际上,对于固定五位数,只需比较:

  • 第 1 位(万位) == 第 5 位(个位)

  • 第 2 位(千位) == 第 4 位(十位)

中间第 3 位(百位)无需比较。

运行示例

请输入一个五位数:12321
是一个回文数!
请输入一个五位数:12345
不是回文数。
请输入一个五位数:1221
错误:必须是五位数(10000~99999)!
12321
是一个回文数!
👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

规律分析

对于一个五位数N=d1d2d3d2d1 N = d_1d_2d_3d_2d_1 (其中did_i 表示第ii 位数字),其为回文数当且仅当:

{d1=d5d2=d4\begin{cases} d_1 = d_5 \\ d_2 = d_4 \end{cases}

无需关心d3d_3(中间位)。

更通用地,对任意长度的回文数,满足:

digit[i]=digit[n1i],i[0,n/2)\text{digit}[i] = \text{digit}[n - 1 - i], \quad \forall i \in [0, \lfloor n/2 \rfloor)

程序实现

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 + " 不是回文数。");
        }
    }
}

补充说明

  • 回文数是一类具有对称性质的数字,在密码学、数据校验、趣味数学中常见。

  • 本题限定五位数,但方法可推广至任意位数。

  • 字符串法代码简洁,适合快速开发;数学法则节省内存,适合性能敏感场景。

  • 原题出自经典编程练习集,常用于训练数组操作、循环控制、逻辑判断等基础能力。