案例解析
回文数判断
设n是一任意自然数,若将n的各位数字反向排列所得自然数m与n相等,则称n为一回文数。编写程序,从键盘输入一个1~65535之间的数,判断这个数是几位数,并判断这个数是否是回文数。
# 源文件保存为“PalindromeNumber.java”
import java.util.Scanner;
public class PalindromeNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个1~65535之间的自然数:");
int number = scanner.nextInt();
// 判断输入是否合法
if(number < 1 || number > 65535) {
System.out.println("输入的数字超出范围!");
return;
}
// 判断是几位数
int temp = number;
int digitCount = 0;
while(temp != 0) {
temp /= 10;
digitCount++;
}
System.out.println("这是一个" + digitCount + "位数");
// 判断是否是回文数
temp = number;
int reversedNumber = 0;
while(temp != 0) {
reversedNumber = reversedNumber * 10 + temp % 10;
temp /= 10;
}
if(number == reversedNumber) {
System.out.println(number + "是回文数");
} else {
System.out.println(number + "不是回文数");
}
scanner.close();
}
}
运行结果 输入12345
请输入一个1~65535之间的自然数:12345 这是一个5位数 12345不是回文数
输入12321
请输入一个1~65535之间的自然数:12321 这是一个5位数 12321是回文数
代码解析:
- 使用Scanner获取用户输入的数字
- 第一个while循环计算数字的位数:不断除以10直到为0,统计循环次数
- 第二个while循环反转数字:每次取出最后一位,拼接到反转数上
- 最后比较原数字和反转后的数字是否相同
字符串方式判断回文数
# 源文件保存为“StringPalindrome.java”
import java.util.Scanner;
public class StringPalindrome {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个自然数:");
String numStr = scanner.next();
System.out.println("这是一个" + numStr.length() + "位数");
boolean isPalindrome = true;
for(int i=0; i<numStr.length()/2; i++) {
if(numStr.charAt(i) != numStr.charAt(numStr.length()-1-i)) {
isPalindrome = false;
break;
}
}
System.out.println(numStr + (isPalindrome ? "是" : "不是") + "回文数");
scanner.close();
}
}
运行结果 输入12345
请输入一个自然数:12345 这是一个5位数 12345不是回文数
输入12321
请输入一个自然数:12321 这是一个5位数 12321是回文数
代码特点:
- 将数字转为字符串处理
- 直接获取字符串长度作为位数
- 双指针法比较首尾字符
- 更简洁直观的实现方式
递归判断回文数
# 源文件保存为“RecursivePalindrome.java”
import java.util.Scanner;
public class RecursivePalindrome {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个自然数:");
int number = scanner.nextInt();
int digits = (int)Math.log10(number) + 1;
System.out.println("这是一个" + digits + "位数");
System.out.println(number + (isPalindrome(number) ? "是" : "不是") + "回文数");
scanner.close();
}
public static boolean isPalindrome(int num) {
return num == reverse(num, 0);
}
private static int reverse(int num, int rev) {
if(num == 0) return rev;
return reverse(num/10, rev*10 + num%10);
}
}
运行结果 输入12345
请输入一个自然数:12345 这是一个5位数 12345不是回文数
输入12321
请输入一个自然数:12321 这是一个5位数 12321是回文数
代码亮点:
- 使用递归实现数字反转
- Math.log10计算数字位数
- 展示了递归的编程思想
- 代码结构更加模块化
回文数生成器
# 源文件保存为“PalindromeGenerator.java”
import java.util.Scanner;
public class PalindromeGenerator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入起始数字:");
int start = scanner.nextInt();
System.out.print("请输入结束数字:");
int end = scanner.nextInt();
System.out.println(start + "到" + end + "之间的回文数:");
for(int i=start; i<=end; i++) {
if(isPalindrome(i)) {
System.out.print(i + " ");
}
}
scanner.close();
}
public static boolean isPalindrome(int num) {
String s = String.valueOf(num);
return s.equals(new StringBuilder(s).reverse().toString());
}
}
运行结果 输入起始数字10000和结束数字19999
请输入起始数字:10000 请输入结束数字:19999 10000到19999之间的回文数: 10001 10101 10201 10301 10401 10501 10601 10701 10801 10901 11011 11111 11211 11311 11411 11511 11611 11711 11811 11911 12021 12121 12221 12321 12421 12521 12621 12721 12821 12921 13031 13131 13231 13331 13431 13531 13631 13731 13831 13931 14041 14141 14241 14341 14441 14541 14641 14741 14841 14941 15051 15151 15251 15351 15451 15551 15651 15751 15851 15951 16061 16161 16261 16361 16461 16561 16661 16761 16861 16961 17071 17171 17271 17371 17471 17571 17671 17771 17871 17971 18081 18181 18281 18381 18481 18581 18681 18781 18881 18981 19091 19191 19291 19391 19491 19591 19691 19791 19891 19991
代码亮点:
- 生成指定范围内的所有回文数
- 使用StringBuilder的reverse方法
- 展示了批量处理的思想
- 实用性强,可以直接看到回文数分布
操作练习题
回文素数判断
要求:
- 判断一个数是否既是素数又是回文数
- 使用函数封装不同功能
参考代码:
# 源文件保存为“PrimePalindrome.java”
import java.util.Scanner;
public class PrimePalindrome {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个自然数:");
int num = scanner.nextInt();
boolean isPrime = isPrime(num);
boolean isPalindrome = isPalindrome(num);
System.out.println(num + "是" + (isPrime ? "素数" : "非素数"));
System.out.println(num + "是" + (isPalindrome ? "回文数" : "非回文数"));
System.out.println(num + (isPrime && isPalindrome ? "是" : "不是") + "回文素数");
scanner.close();
}
public static boolean isPrime(int n) {
if(n <= 1) return false;
for(int i=2; i*i<=n; i++) {
if(n%i == 0) return false;
}
return true;
}
public static boolean isPalindrome(int n) {
return n == reverse(n, 0);
}
private static int reverse(int num, int rev) {
return num == 0 ? rev : reverse(num/10, rev*10 + num%10);
}
}
运行结果 输入数字11
请输入一个自然数:11 11是素数 11是回文数 11是回文素数
回文字符串判断
要求:
- 输入一个字符串
- 判断是否是回文(忽略大小写和标点)
- 只考虑字母和数字
参考代码:
# 源文件保存为“StringPalindromeChecker.java”
import java.util.Scanner;
public class StringPalindromeChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String input = scanner.nextLine();
String filtered = input.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
boolean isPalindrome = filtered.equals(
new StringBuilder(filtered).reverse().toString());
System.out.println("\"" + input + "\"" +
(isPalindrome ? "是" : "不是") + "回文字符串");
scanner.close();
}
}
运行结果 输入12a21
请输入一个字符串:12a21 "12a21"是回文字符串