算法系列——打印回文数

回文数判定是学习程序设计和初等算法设计的时候,经常会遇到的题目,对于回文数的判定算法包含了算法过程设计的基础性思考,今天又碰到这个问题,恰好正在深入学习Java,所以用Java做了算法的重写,特此记录。

概念

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。


题目要求

输出1-10000内回文数。


思路分析

根据回文数的定义,可以知道回文数的几个特征

1.回文数正着读,倒着读一样,也就是说它本身与它自身的反转序列保持一致。

2.回文数具备对称性,既可以是偶数型对称,也可以是奇数型对称。

由此我们可以得出判定回文数的两种方式。

一种是取得原数的反转数字,与原数字对比;另外一种则是通过比较对称位置的数字是否均相同来判定是否是回文数。

代码

public class CircleNumber {
	/**
	 * 打印10000以内的回文数
	 */
	public static void main(String[] args) {
		int count = 0;
		for (int i = 1; i <= 10000; i++)
			if (isCircleNumber3(i)) {
				count++;
				System.out.println("第" + count + "个回文数:" + i);
			}

	}

	// 将字符串转置,然后调用equals方法比较
	public static boolean isCircleNumber1(int num) {
		String num_str = String.valueOf(num);
		StringBuffer sb = new StringBuffer(num_str).reverse();
		return num_str.equals(sb.toString());
	}

	// 计算原数字的反转数字,与原数字对比
	public static boolean isCircleNumber2(int num) {
		int temp = 0;
		int oldValue = num;
		while (num > 0) {
			temp = temp * 10 + num % 10;
			num /= 10;
		}
		return oldValue == temp;
	}

	// 根据对称特征来进行回文数判定的写法
	public static boolean isCircleNumber3(int num) {
		// 获取字符串表示便于取值
		String temp = String.valueOf(num);
		// 获取数字长度
		int len = temp.length();
		// 定义两个游标
		int i = 0, j = len - 1;
		while (i <= len / 2 && j >= len / 2) {
			if (temp.charAt(i) == temp.charAt(j)) {
				i++;
				j--;
			} else
				return false;
		}

		return true;
	}
}

运行结果

第1个回文数:1
第2个回文数:2
第3个回文数:3
第4个回文数:4
第5个回文数:5
第6个回文数:6
第7个回文数:7
第8个回文数:8
第9个回文数:9
......

......

......

第194个回文数:9559
第195个回文数:9669
第196个回文数:9779
第197个回文数:9889
第198个回文数:9999


你可能感兴趣的:(算法,算法系列)