Java-为什么我的代码不能产生正确的结果?

时间:2018-01-26 10:18:00

标签: java methods palindrome

我正在解决ProjectEuler的问题4:

  

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。

     

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

我无法做对。这是我的代码:

public static long reverseNumber(long number){
    long reversed = 0;

    while(number != 0) {
        long digit = number % 10;
        reversed = reversed * 10 + digit;
        number /= 10;
    }
    return reversed;
}

long sum,finalSum=1,revSum;
for (int i=100;i<1000;i++){
    for (int j=100;j<1000;j++){               
        sum=i*j;
        revSum=reverseNumber(sum);
        if (sum==revSum){
            finalSum=sum;
        }
    }
}
System.out.println(finalSum);

这是我在网上找到的一些代码,它运作得很好:

int maxPalin = -1;
for (int i = 100; i < 1000; i++) {
    for (int j = 100; j < 1000; j++) {
        int prod = i * j;
        if (prod > maxPalin){
            if (reverseNumber(prod)>maxPalin) {
                maxPalin = prod;
            }
        }
    }
}
System.out.println(Integer.toString(maxPalin));

但我的错误是什么?

1 个答案:

答案 0 :(得分:3)

目标是找到最大回文,这是两个数字在100到999之间的乘积。您的代码的问题是您认为找到的最后一个回文最大。这个假设是错误的。

对于您找到的每个回文,您应该检查它是否大于您找到的最后一个回文,然后再选择它作为最大回文的候选者。

BTW,您发布的第二个片段也不正确,因为它实际上并未检查当前产品是否为回文(即prod==reverseNumber(prod))。

正确的实施方式是:

public static void maxp () {
    int maxPalin = -1;
    for (int i = 100; i < 1000; i++) {
        for (int j = 100; j < 1000; j++) {
            int prod = i * j;
            if (reverseNumber(prod) == prod && prod > maxPalin) {
                maxPalin = prod;
            }
        }
    }
    System.out.println(maxPalin);
}

您的代码返回的回文不是最大回文(995和583的乘积):

580085

第二个片段会返回一个根本不是回文的数字:

980099

正确答案是913和993的产物:

906609

你的实现没有找到它,因为你用后来的迭代中找到的回文覆盖了它,这是i更高j的产物。