问题描述如下:
“回文数从两边读值是一样的。两个两位数乘积的最大回文数是9009=99*99,求两个三位数乘积的最大回文数?”
那么我们很快就可以得到实现代码,如下:
private static Long getPalindromicNumber() {
Long max = 0L;
for (Long i = 100L; i <= 999; i++) {
for (Long j = 100L; j <= 999; j++) {
if (isPalindromicNumber(i * j)) {
if (i * j > max) {
max = i * j;
}
}
}
}
return max;
}
private static boolean isPalindromicNumber(Long n) {
StringBuffer s = new StringBuffer(n + "");
s.reverse();
return Long.parseLong(s.toString()) == n;
}
可以得到结果906609。
那么还有地方可以优化么?
如果循环从999开始到100,那么就可以更早的获得最大的回文数而不用因为三位数小而去改变max。
private static Long getPalindromicNumber() {
Long max = 0L;
for (Long i = 999L; i >= 100; i--) {
for (Long j = 999L; j >= 100; j--) {
if (isPalindromicNumber(i * j)) {
if (i * j > max) {
max = i * j;
}
}
}
}
return max;
}
我们再去观察,如果某个回文数888888=924*962,那么也有可能是962*924,两次获得某个回文数,如果判断j>i,应该可以回避此问题,减少将近一半的数值计算。
private static Long getPalindromicNumber() {
Long max = 0L;
for (Long i = 999L; i >= 100; i--) {
for (Long j = 999L; j >= i; j--) {
if (isPalindromicNumber(i * j)) {
if (i * j > max) {
max = i * j;
}
}
}
}
return max;
}
end,请不吝赐教!
@anthor ClumsyBird