最大的回文产品 - 欧拉项目

Pra*_*mar 1 java palindrome

我试图解决项目欧拉问题4,它是:

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

这是我的解决方案,它的输出是997799,但这不是正确的答案,我想知道问题出在哪里:

package projecteuler;

public class Pro4 {

    public static void main(String[] args) {

        for(int i=999*999;i>=100*100;i--){
            if(isPalindrome(i)==true){
                System.out.println(i);
                break;
            }
        }
    }

    static boolean isPalindrome(int x){
        int[] bits = new int[7];
        int index=1;
        while(x>0){
            bits[index]=x%10;
            index++;
            x/=10;
        }
        for(int i=1;i<=index/2;i++){
            if(bits[i]!=bits[index-i]){
                return false;
            }
        }
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

ROM*_*eer 6

这是一个不会遍历所有6位数字的解决方案:

public static boolean isPalindrome(int nr) {
    int rev = 0;                    // the reversed number
    int x = nr;                     // store the default value (it will be changed)
    while (x > 0) {
        rev = 10 * rev + x % 10;
        x /= 10;
    }
    return nr == rev;               // returns true if the number is palindrome
}

public static void main(String[] args) {

    int max = -1;

    for ( int i = 999 ; i >= 100 ; i--) {
        for (int j = 999 ; j >= 100 ; j-- ) {
            int p = i * j;
            if ( max < p && isPalindrome(p) ) {
                max = p;
            }
        }
    }
    System.out.println(max > -1? max : "No palindrome found");
}
Run Code Online (Sandbox Code Playgroud)

编辑:

该方法的改进解决方案main(根据Peter Schuetze)可以是:

public static void main(String[] args) {

    int max = -1;

    for ( int i = 999 ; i >= 100 ; i--) {
        if ( max >= i*999 ) { 
            break;
        }
        for (int j = 999 ; j >= i ; j-- ) {             
            int p = i * j;
            if ( max < p && isPalindrome(p) ) {
                max = p;
            }
        }
    }       
    System.out.println(max > -1? max : "No palindrome found");
}
Run Code Online (Sandbox Code Playgroud)

对于这个特殊的例子,时间大约是2倍,但如果你的数字更大,那么改进将更加显着.

输出:

906609
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是+1的最佳解决方案.我还喜欢你在确定它是否是回文之前先与max进行比较的事实.廉价的操作可能会节省一些时间.但是,还有优化空间.1)你几乎计算所有产品两次,因为`i*j = j*i`你只需要为所有`j> = i`计算产品.2)对于小`i`,没有'j <1000`将产生大于'max`的产品.因此,添加`if(max/i> 1000){i = 99}`将有效地缩短计算最大回文到当前时间的1/10或更少的时间. (3认同)