Java 最大回文产品-euler项目

Java 最大回文产品-euler项目,java,palindrome,Java,Palindrome,我试图解决Euler项目,即: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99。 查找由两个3位数字的乘积构成的最大回文。 这是我的解决方案,它的输出是997799,但这不是正确的答案,我想知道问题出在哪里: package projecteuler; public class Pro4 { public static void main(String[] args) { for(int i=999*999;i>=100*1

我试图解决Euler项目,即:

回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是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;
    }

}
package;
公共类Pro4{
公共静态void main(字符串[]args){
对于(int i=999*999;i>=100*100;i--){
if(isAlindrome(i)=真){
系统输出打印LN(i);
打破
}
}
}
静态布尔值isAlindrome(int x){
int[]位=新的int[7];
int指数=1;
而(x>0){
位[索引]=x%10;
索引++;
x/=10;
}

对于(int i=1;i您正在按顺序将i从999*999递减到100*100。这并不一定意味着您找到的第一个回文是两个3位数的乘积


回文997799包含11和90709作为基本因子,这不是两个3位数的乘积。

您将i从999*999顺序递减到100*100。这并不一定意味着您找到的第一个回文是两个3位数的乘积


回文997799有11和90709作为基本因子,它们不是两个3位数字的乘积。

for循环从998001运行到100000。
i
的for循环从998001运行到100000。在您的程序中没有任何地方检查
i
实际上可以是两个3位数字的乘积。

for循环从998001运行到
i
到100000。您的程序中没有任何地方检查
i
实际上可以是两个3位数字的乘积。

您正在迭代编号为998001到10000的循环,因为某些数字可能不是两个3位数字的乘积。
您应该将两个3位数字相乘,然后比较该数字是否为回文

for循环代码应为:

  for(int i=999;i>=100;i--)  
  {
        int k = i-1;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
  }  
for(int i=999;i>=100;i--){
        int k = i;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
        else{
            k = i - 1;
            product = i * k;
            System.out.println(i+" * "+k+"  = "+product);
            if(isPalindrome(product)==true){
                System.out.println("palindrum number "+product);
                System.out.println("Product of : "+i+" * "+k);
                break;
            }
        }
    }
这将给出最大回文数,其中的回文数是两个3位数的乘积。
输出为:

palindrum number 289982
Product of : 539 * 538  
如果两个数字在相乘时不同,则为真。
如果您希望包含相同编号的产品以检查是否有回文,则上述代码中可能没有什么变化。
为此,代码应为:

  for(int i=999;i>=100;i--)  
  {
        int k = i-1;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
  }  
for(int i=999;i>=100;i--){
        int k = i;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
        else{
            k = i - 1;
            product = i * k;
            System.out.println(i+" * "+k+"  = "+product);
            if(isPalindrome(product)==true){
                System.out.println("palindrum number "+product);
                System.out.println("Product of : "+i+" * "+k);
                break;
            }
        }
    }
这将为您提供如下输出:

palindrum number 698896
Product of : 836 * 836

我认为这就是您需要做的。

您正在迭代编号为998001到10000的循环,因为有些数字可能不是两个三位数的乘积。
您应该将两个3位数字相乘,然后比较该数字是否为回文

for循环代码应为:

  for(int i=999;i>=100;i--)  
  {
        int k = i-1;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
  }  
for(int i=999;i>=100;i--){
        int k = i;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
        else{
            k = i - 1;
            product = i * k;
            System.out.println(i+" * "+k+"  = "+product);
            if(isPalindrome(product)==true){
                System.out.println("palindrum number "+product);
                System.out.println("Product of : "+i+" * "+k);
                break;
            }
        }
    }
这将给出最大回文数,其中的回文数是两个3位数的乘积。
输出为:

palindrum number 289982
Product of : 539 * 538  
如果两个数字在相乘时不同,则为真。
如果您希望包含相同编号的产品以检查是否有回文,则上述代码中可能没有什么变化。
为此,代码应为:

  for(int i=999;i>=100;i--)  
  {
        int k = i-1;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
  }  
for(int i=999;i>=100;i--){
        int k = i;
        int product = i * k;
        System.out.println(i+" * "+k+"  = "+product);

        if(isPalindrome(product)==true){
            System.out.println("palindrum number "+product);
            System.out.println("Product of : "+i+" * "+k);
            break;
        }
        else{
            k = i - 1;
            product = i * k;
            System.out.println(i+" * "+k+"  = "+product);
            if(isPalindrome(product)==true){
                System.out.println("palindrum number "+product);
                System.out.println("Product of : "+i+" * "+k);
                break;
            }
        }
    }
这将为您提供如下输出:

palindrum number 698896
Product of : 836 * 836

我认为这就是您需要做的。

这里有一个解决方案,它不会遍历所有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");
}
对于这个特定的例子,时间大约是原来的2倍,但是如果你有更大的数字,改善会更显著

输出

906609

以下是一个不会遍历所有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");
}
对于这个特定的例子,时间大约是原来的2倍,但是如果你有更大的数字,改善会更显著

输出

906609

你还假设你找到的第一个回文是最大的,你找到的第一个回文是580085,这不是正确的答案


您还假设找到的第一个回文是两个3位数字的乘积。您还应该使用两个不同的数字,而不是将999乘以999并向下迭代到100*100。

您还假设找到的第一个回文是最大的。您找到的第一个回文是580085,这是这不是正确的答案


您还假设您将找到的第一个回文是两个3位数字的乘积。您还应该使用两个不同的数字,而不是将999乘以999,然后向下迭代到100*100。

以上似乎都没有给出正确的答案。(我认为逻辑可能是正确的,但正确的答案是906609)。由于您不知道数字是6位还是5位,您需要检查这两个数字。下面是一个简单的代码

乘法是一次到多次调用的,我知道

i = 999
for u in range (100,1000):
    for y in range (100,1000):
        if len(str(u*y)) == 5 and str(u*y)[0]==str(u*y)[4]and str(u*y)[1]==str(u*y)[3] and u*y>i:
        i=u*y
        print ('the product of ', u, ' and ',y,' is: ',u*y)
    elif len(str(u*y)) == 6 and str(u*y)[0]==str(u*y)[5]and str(u*y)[1]==str(u*y)[4]and str(u*y)[2]==str(u*y)[3]and u*y>i:
        i=u*y
        print ('the product of ', u, ' and ',y,' is: ',u*y)

上面的这些似乎都没有给出正确的答案。(我认为逻辑可能是正确的,但正确的答案是906609)。由于您不知道数字是6位还是5位,您需要检查这两个数字。下面是一个简单的代码来做同样的事

乘法是一次到多次调用的,我知道

i = 999
for u in range (100,1000):
    for y in range (100,1000):
        if len(str(u*y)) == 5 and str(u*y)[0]==str(u*y)[4]and str(u*y)[1]==str(u*y)[3] and u*y>i:
        i=u*y
        print ('the product of ', u, ' and ',y,' is: ',u*y)
    elif len(str(u*y)) == 6 and str(u*y)[0]==str(u*y)[5]and str(u*y)[1]==str(u*y)[4]and str(u*y)[2]==str(u*y)[3]and u*y>i:
        i=u*y
        print ('the product of ', u, ' and ',y,' is: ',u*y)
公共类最大回文生成{
公共静态void main(字符串参数[]){
LargestPalindromProduct obj=新的LargestPalindromProduct();
System.out.println(“两个3位数字乘积的最大回文是”+obj.getLargestPalindromeProduct(3));
}
/*
*@param数字
*@返回
*/
私有整数getLargestPalindromeProduct(整数位数){
int最大回文乘积=-1;
int startNum=(int)Math.pow(10位数字)-1;
int endNum=(int)Math.pow(10,数字-1)-1;
对于(int i=startNum;i>endNum;i--){
对于(int j=startNum;j>endNum;j--){
if(isPalindrome(i*j)){
最大回文积=Math.max(最大回文积,i*j);
}
}
}
返回最大回文量产品;
}
私人布利亚酒店