题目描述
所谓回文数,即顺序与逆序均为相同的整数。如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.*如何反转数字
解决了这两个问题,其实也就迎刃而解了
接下来请看代码,注释标的也很清楚:
import java.util.Scanner;
public class Demo06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();// 下限
int b = sc.nextInt();// 上限
int count = 0;// 下标
int num = a;
while (true) {
//当为回文数时,输出并a++ 下标重置为0 num也重置为a继续循环
if (pd(num)) {
System.out.println(a + "(" + count + ")" + ":" + num);
a++;
count = 0;
num = a;
}
if (!pd(num)) {
count++;
num+=fz(num);
}
//当一个数字操作了15次还未找到,就切换下一个数字
if (count==15) {
System.out.println(a + "(?)" + ":" );
count=0;
a++;
num=a;
}
if (a==b+1) {
break;
}
}
sc.close();//资源关闭
}
//判断是否为回文数
static boolean pd(int num) {
//StringBuffer中的reverse方法可以反转字符串
StringBuffer sb = new StringBuffer();
sb.append(num);
String b = sb.reverse().toString();
int a = Integer.parseInt(b);
if (num == a) {
return true;
} else {
return false;
}
}
// 反转int
static int fz(int num) {
int a = 0;
while (true) {
int n = num % 10;
a = a * 10 + n;
num /= 10;
if (num == 0) {
return a;
}
}
}
}