Java 由两个3位数字的乘积构成的最大回文&引用;爪哇语;
我知道以前有人问过这个问题,但我不喜欢任何答案。它们看起来都比需要的复杂。我更喜欢让事情尽可能简单 我写了我的代码,从我看到没有理由它不工作?我遗漏了什么吗?我没有得到一个错误,但我没有得到任何结果 公共类最大回文乘积{Java 由两个3位数字的乘积构成的最大回文&引用;爪哇语;,java,Java,我知道以前有人问过这个问题,但我不喜欢任何答案。它们看起来都比需要的复杂。我更喜欢让事情尽可能简单 我写了我的代码,从我看到没有理由它不工作?我遗漏了什么吗?我没有得到一个错误,但我没有得到任何结果 公共类最大回文乘积{ public static void main(String[] args) { // A palindromic number reads the same both ways. The largest palindrome // made from the
public static void main(String[] args) {
// A palindromic number reads the same both ways. The largest palindrome
// made from the product of two 2-digit numbers is 9009 = 91 × 99.
//
// Find the largest palindrome made from the product of two 3-digit
// numbers.
long product;
for (int i = 999; i >= 100; i--) {
for (int j = 999; i >= 100; i--) {
product = j * i;
if (reverse(product)) {
System.out.println(product);
break;
}
}
}
}
private static final boolean reverse(long value) {
long result = 0;
while (value != 0) {
result *= 10;
result += value % 10;
value /= 10;
}
return (result == value);
}
}
你的内部循环有一个相当大的错误
for (int j = 999; i >= 100; i--) {
应该是
for (int j = 999; j >= 100; j--) {
自从
它们看起来都比需要的复杂。我更喜欢让事情尽可能简单
让我们重写反向
private static final boolean reverse(long value) {
String str = String.valueOf(value);
return str.equals(new StringBuilder(str).reverse().toString());
}
最后,您只是在中断内部循环。请使用System.exit
或标记为break
的方法
outer: for (int i = 999; i >= 100; i--) {
for (int j = 999; j >= 100; j--) {
long product = j * i;
if (reverse(product)) {
System.out.printf("%d * %d = %d%n", i, j, product);
break outer;
}
}
}
您的算法中有一个逻辑错误。假设reverse(product)
为真,那么您的回文乘积最大,因为这两个循环从999下降到100。这不一定正确。例如,假设您的程序找到的第一个回文是(i=999)*(j=3)。结果是2997(这不是回文,但假设是)。你怎么能确定没有更大的回文,例如i=998和j=997?谢谢。我不敢相信我错过了for循环中的错误。在我决定发布之前,我查看了很长时间。循环不会同时迭代。开始时,外部循环i
的值固定为999,而内部循环j
从999变为100。因此,程序将在到达案例(i==998和j==997)之前到达案例(i==999和j==3)是有意义的。我将添加一个maxNum变量并去掉中断符。if(reverse(product)&&product>max)max=product;