由两个3位数字的乘积制成的最大回文。 " JAVA"

时间:2016-05-16 14:02:12

标签: java

我意识到之前已经问过这个问题,但我并不喜欢任何答案。他们看起来都比较复杂。我更喜欢让事情变得尽可能简单。

我编写了我的代码,从我看到它没有理由不起作用?我错过了什么吗?我没有收到任何错误,但我没有得到任何结果。

公共类LargestPalindromeProduct {

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);
  }
}

2 个答案:

答案 0 :(得分:3)

你的内循环中有一个相当大的错误,

for (int j = 999; i >= 100; i--) {

应该是

for (int j = 999; j >= 100; j--) {

从那以后

  

他们看起来都比较复杂然后需要。我更喜欢让事情变得尽可能简单。

让我们重写reverse;

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;
        }
    }
}

答案 1 :(得分:1)

您的算法存在逻辑错误。您认为当reverse(product)为真时,您就拥有了LargestPalindromProduct,假设两个循环从999降到100.这不是必需的。例如,假设您的程序找到的第一个回文是(i = 999)*(j = 3)。结果是2997(这不是回文,但假设它是)。你怎么能确定没有更大的回文,例如i = 998和j = 997?