回文数猜测,通过Java代码实现

题目描述:

所谓回文数,即顺序与逆序均为相同的整数。如292、10301均为回文数。

有人猜测: 任意一个十进制整数n(n不为回文数),经有限次“顺逆求和”操作可得到一个回文数。这里的“顺逆求和”操作就是把一个数与其逆序数相加。 例如,对于n=69,有(1)69+96=165 (2)165+561=726 (3)726+627=1353 (4) 1353+ 3531=4884(回文数)。

试设计程序,验证某一区间[x1,x2]中的每一个数n是否为回文数,若不是,请展示n通过以上“顺逆求和”操作转化为回文数的步骤数。

例如n=69时经4次操作得到回文数,输出69(4)及得到的回文数4884。如果超过15步还未能转化为回文数,则终止操作,输出n(?),表明该数可能不满足猜测。

输入

输入两个整数(第一个小于第二个)。

输出

输出回文数的步骤数及相应的回文数。

样例输入

86 90

样例输出

86(3):1111
87(4):4884
88(0):88
89(?):
90(1):99

解题思路

1.首先将题目划分,先猜测一个,最后在添加循环求多个
2.既然猜测回文数,就需要有判断回文数的部分,所以可以将判断回文数写成一个方法方便调用
3.猜测的条件有两个即结束循环的条件:一个是成为回文数,另一个是步骤数超过15次.
4.反转数字的方法有多种,可以自由运用
5.打印的情况有两种

具体代码

import java.util.Scanner;

/**
 * @author hf
 *
 */
public class Blogs3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		StringBuffer sbBuffer = new StringBuffer(); // 定义字符串缓冲类
		for (int i = n; i <= m; i++) {
			int end = i;
			int count = 0; // 次数
			// 不是回文数并且次数小于15次的时候,继续循环
			while (!isPalindrome(end) && ++count <= 15) {
				// 字符串缓冲类的添加,反转以及返回成字符串,最后转换成int类型
				int temp = Integer.parseInt(sbBuffer.append(end).reverse().toString());
				end = end + temp; // 原值 + 反转值
				sbBuffer.delete(0, sbBuffer.capacity());// 删除字符串缓冲内容
			}
			// 打印的两种情况
			if (count > 15) {
				System.out.println(i + "(?):");
			} else {
				System.out.println(i + "(" + count + "):" + end);
			}
		}
		sc.close();
	}

	/**
	 * 判断整数是否是回文数
	 * 1.若该整数是一个负数那么肯定不是回文数,
	 * 或者该整数的最后一位为0而第一位不为0也不可能是回文数,
	 * 所以以上两种情况可以直接将这两种情况判断返回false。
	 * 2.反转后半部分与前半部分作比较,分奇数和偶数两种情况
	 * 
	 * @param n
	 * @return
	 */
	public static Boolean isPalindrome(int n) {
		int sum = 0;
		if ((n < 0) || (n / 10 != 0 && n % 10 == 0)) {
			return false;
		} else {
			while (n > sum) {
				sum = sum * 10 + n % 10;
				n /= 10;
			}
			// n为偶数时
			if (sum == n) {
				return true;
			}
			// n为奇数时
			if (sum / 10 == n) {
				return true;
			}
		}
		return false;
	}
}

运行结果

样例运行结果图示

猜你喜欢

转载自blog.csdn.net/qq_45481524/article/details/107016800