最大的回文产品JAVA

时间:2014-10-28 11:58:03

标签: java palindrome

我已经为问题4 @ https://projecteuler.net/problem=4

编写了代码

以下是问题:

  

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

     

找到由两个3位数的产品制成的最大的回文   号。

这是我的代码

我测试了它,对于第一个循环,它迭代2次(对于i = 100和101),对于第二个循环,它迭代到991(j = 991)

您可以查看我的代码并帮我找出问题所在吗?

public class Main 
{
    public static void main (String [] args)
    {   



        int resultMult =0;
        String strResultMult = "";
        String even1stHalf = ""; 
        String even2ndHalf = ""; 
        String maxPalindromEven = ""; 
        String odd1stHalf = ""; 
        String odd2ndHalf = ""; 
        String maxPalindromOdd = "";


        for (int i=100;i<=999;i++) 
        {   
            for(int j=100;j<=999;j++) 
            {   
                resultMult = i*j;
                strResultMult = String.valueOf(resultMult);
                if(strResultMult.length()%2==0) 
                {
                    for (int k=0;k<strResultMult.length()/2 ;i++)
                    {
                        even1stHalf = even1stHalf + strResultMult.charAt(k);
                    }
                    for (int l=strResultMult.length()-1;l>=strResultMult.length()/2;l--)
                    {
                        even2ndHalf = even2ndHalf + strResultMult.charAt(l);
                    }
                    if(even1stHalf.equals(even2ndHalf))
                    {
                        maxPalindromEven = strResultMult;
                    }
                }
                else
                {
                    for (int m=0;m<strResultMult.length()/2 ;m++)
                    {
                        odd1stHalf = odd1stHalf + strResultMult.charAt(m);
                    }
                    for (int n=strResultMult.length()-1;n>strResultMult.length()/2 ;n--)
                    {
                        odd2ndHalf = odd2ndHalf + strResultMult.charAt(n);
                    }
                    if(odd1stHalf.equals(odd2ndHalf))
                    {
                        maxPalindromOdd = strResultMult;
                    }

                }
        }           
    }       
}
}

5 个答案:

答案 0 :(得分:0)

而不是:

for (int k=0;k<strResultMult.length()/2 ;i++)
                                         ^

我相信你的意思是写:

for (int k=0;k<strResultMult.length()/2 ;k++)
                                         ^

答案 1 :(得分:0)

代码分解使问题更容易进行调试:

  private static boolean isPalindrome(String value) {
    if (null == value)
      return false;

    for (int i = 0; i < value.length() / 2; ++i)
      if (value.charAt(i) != value.charAt(value.length() - 1 - i))
        return false;

    return true;
  }

  ...

  public static void main (String [] args) {
    int max = 0;

    for (int i = 100; i <= 999; ++i)
      for (int j = i; j <= 999; ++j) { // i*j == j*i so you can start from i
        int product = i * j;

        if ((product > max) && isPalindrome(String.valueOf(product)))
          max = product;
      }
    ...

答案 2 :(得分:0)

你可以尝试这个。它显示最大的3位数回文数: -

class Pal{
boolean pal(int no){
    int d=no,rev=0;
    while(d>0){
        rev=(rev*10)+(d%10);
        d/=10;
    }
    boolean bo=(rev==no)?true:false;
    return bo;
}
void show(){
    int max=0,num=0,mock=0;
    for(int i=100;i<1000;i++){
        for(int j=100;j<1000;j++){
             num=(i*j);
            mock=num;
            if(pal(mock)==true)
            max=num;
        }
    }
System.out.println("Largest Palindrome:-"+max);
}
}

答案 3 :(得分:0)

试图测试你的解决方案,但同时仍在处理我的代码,当我尝试比较两个字符串时,似乎在if循环中被打破

if(even1stHalf.equals(even2ndHalf))
{   
    maxPalindromEven = even1stHalf+even2ndHalf;
    //System.out.println(even1stHalf+even2ndHalf);
}

if(odd1stHalf.equals(odd2ndHalf))
{   
    maxPalindromOdd = odd1stHalf+odd2ndHalf;
    //System.out.println(odd1stHalf+odd2ndHalf);
}

答案 4 :(得分:0)

除了你的编程问题,我会评论你的算法。基本上,您将乘以两个数字(100=<number< 1000)的所有可能性,并检查每个产品,如果它是回文,也与预先存储的最大回文进行比较。我不认为这是解决问题的有效方法。

我们如何相反地思考,从最大的回文(999999),检查每个回文,直到找到一个可以乘以范围[100,1000)中的两个数字的那个?

所以基本上是一个外部循环:

loop n in 999 -100
    build string n = n + reverse(n)  // here we have palindrome
    //check if there are two factors of n, 
    //which fall in range [100,999] 
    sqrtRoot = sqrt(n)
    if sqrtRoot is integer, we found the factor, n is the number
    else
        a=b=sqrtRoot
        while(a<1000 and b > 99)
                if a*b==n
                    factors = [a,b]
                    break
                else if a*b >n
                    b--
                else // here is the a*b<n case
                    a++
    //here we have the factors, found or not found. 
    // if we found factor, n is the largest number