2014-10-28 4 views
-1

я написал код для задачи 4 @https://projecteuler.net/problem=4Самый большой палиндром продукт JAVA

вот вопрос:

палиндромной число читается одинаково в обоих направлениях. Самый большой палиндром , изготовленный из продукта двух двузначных чисел, составляет 9009 = 91 × 99.

Найти самый большой палиндром из продукта двух 3-значных цифр .

Вот мой код

Я проверил его и для 1-го цикла он перебирает в 2 раза (при г = 100 и 101), а для 2-го цикла он перебирает на 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; 
        } 

       } 
     }   
    }  
} 
} 
+0

В чем проблема? Лично я не хочу быть вашим рецензентом кода. – duffymo

+0

разберите код: реализовать метод 'логическое isPalindrome (значение String)' –

+0

Ty Дмитрий, собирается сохранить его в моем сознании – Przemek85

ответ

0

Вместо:

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

Я считаю, что вы имели в виду, чтобы написать:

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

я нашел 2 мин назад Ty сударь :) Все еще работает над другими проблемами – Przemek85

+0

@ Przemek85 Добра для тебя. – Eran

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; 
     } 
    ... 
+0

Ty, собираюсь его протестировать :) – Przemek85

0

Вы можете попробовать это one.It показывает большой 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); 
} 
} 
+0

Ty, собираюсь его протестировать :) – Przemek85

0

Going, чтобы проверить свои решения, но пока еще работает на моем коде, кажется, сломана в цикле, если, когда я попытаться сравнить две строки

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

и

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

кроме вашей проблемы программирования, я хотел бы прокомментировать ваш алгоритм. В основном вы будете умножать все возможности двух чисел (100=<number< 1000) и проверять каждый продукт, если он является палиндром, а также сравнить с заранее сохраненным max-palindrome. Я не думаю, что это эффективный способ решения проблемы.

Как насчет мы думаем, что в обратном направлении, от самого большого палиндром (999999), проверьте каждый палиндром, пока найти тот, который можно было бы умножить два числа в диапазоне [100,1000)?

поэтому в основном, петля Outter:

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 
Смежные вопросы