题目
如果把某个数的各个数字按相反的顺序排列,得到的数和原来的数相同,则这个数就是“回文数”。譬如123454321就是一个回文数。
思路
如图;对于十进制数转二进制数;循环取余;商作为新的除数;最后的 余数倒序。
偷懒
- 既然十进制数也要求必须左右对称,那么不必 i++;直接给数 “11,22,101,252”之类的数;不过麻烦也就麻烦在这了!
代码
//产生左右对称的十进制数
private static void reverseNum() {
for (int j = 1; j < 9; j++) {
StringBuilder stringBuilder = new StringBuilder("");
int target = 0;
for (int i = 0; i < 9; i++) {
stringBuilder.append(j).append(i).append(j);
target = Integer.valueOf(stringBuilder.toString());
if (compare28(target)) {
System.out.println(target);
break;
}
stringBuilder.setLength(0);
}
}
}
//获取其 2 进制及 8 进制数;并进行对比。
private static boolean compare28(int target) {
//二进制
StringBuilder jinzhi2 = new StringBuilder("");
int temp2 = 0;
int shang = 0;
int tempTarget = target;
while (true) {
shang = tempTarget / 2;
temp2 = tempTarget % 2;
jinzhi2.append(temp2);
tempTarget = shang;
if (shang == 0) {
break;
}
}
jinzhi2.reverse();
boolean is2 = true;
for (int k = 0; k < jinzhi2.length(); k++) {
if (jinzhi2.charAt(k) != jinzhi2.charAt(jinzhi2.length() - 1 - k)) {
is2 = false;
break;
}
}
if (!is2) return false;
//八进制
StringBuilder jinzhi8 = new StringBuilder("");
int temp8 = 0;
int shang8 = 0;
int tempTarget8 = target;
while (true) {
shang8 = tempTarget8 / 8;
temp8 = tempTarget8 % 8;
jinzhi8.append(temp8);
tempTarget8 = shang8;
if (shang8 == 0) {
break;
}
}
jinzhi8.reverse();
int is8 = 0;
for (int k = 0; k < jinzhi8.length(); k++) {
if (jinzhi8.charAt(k) != jinzhi8.charAt(jinzhi8.length() - 1 - k)) {
is8 = -1;
break;
}
if (k == jinzhi8.length() / 2) {
is8++;
}
}
jinzhi2.setLength(0);
jinzhi8.setLength(0);
return (is8 > 0);
}
问题
这里产生左右对称的十进制数时,是手动的,新产生了2位数,没有结果又产生了三位数,……这不是最优解;值得思考。
思考
- 这里我傻了;10进制转2进制数;不必自己算,
- 10 → 2
String s = Integer.toBinaryString(num);
- 10 → 8
String s = Integer.toOctalString(num);
- 10 → 16
String s = Integer.toHexString(num)
; - 所以只需要判断:(num.toString(8) == num.toString(8).reverse())即可;