题目描述:
所谓回文数,即顺序与逆序均为相同的整数。如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;
}
}