2014-09-28 4 views
0

Я знаю, что мой метод isPalindrome работает, потому что когда я подключаюсь к 906609, он возвращает true, и я знаю, что мой метод Problem4 в какой-то момент умножает 993 и 913 вместе, что дает 906609, но по какой-то причине он ждет до тех пор, пока 580085, чтобы вернуть номер. Что я делаю не так? Я просто не могу заставить его работать :(project euler 4 Java

public static boolean isPalindrome(int number){ 
    //checks to see if a number is a palendrome. (can't start with 0) 
    String numstring = Integer.toString(number); 
    char[] strarr = new char[String.valueOf(number).length()+1]; 
    int x = 0; 
    int y = String.valueOf(number).length()-1; 
    for (int i=0;i<y+1;i++){ 
     strarr[i] = numstring.charAt(i); 
    } 
    for (int a=0;a<String.valueOf(number).length()-1;a++){ 
     if (strarr[x]!=strarr[y]){ 
      return(false); 
     } 
     x++; 
     y--; 
    } 
    return(true); 
} 
public static int Problem4(){ 
    int pp = 0; 
    for (int i=999;i>100;i--){ 
     for (int j=999;j>100;j--){ 
      pp = i*j; 
      if (isPalindrome(pp)){ 
       return(pp); 
      } 
     } 
    } 
    return(pp); 
} 

Я проверил isPalindrome со многими другими номерами, чтобы убедиться, что он функционирует должным образом. Почему он не расслышал ответ? Я перебор в обратном направлении, поэтому он должен получить самый большой палиндром первый ...


РЕШИТЬ: Я просто должен был убедиться, что петля позволило достичь максимально возможного палиндром, вернувшись в конце вместо того, чтобы и изменить значение переменной a, чтобы гарантировать, что это самый высокий палиндром.

public static int Problem4(){ 
    int pp = 0; 
    int a = 0; 
    for (int i=100;i<1000;i++){ 
     for (int j=100;j<1000;j++){ 
      pp = i*j; 
      if (isPalindrome(pp)){ 
       if (pp>a){ 
        a = pp; 
       } 
      } 
     } 
    } 
    return(a); 
} 
+2

Я думаю, что ваш метод 'isPalindrome()' слишком сложный. – BitNinja

+0

Да, это почти шедевр барочного кодирования. –

+0

Вот как выглядит «очевидная» реализация 'isPalindrome':' String s = String.valueOf (n); for (int i = 0, j = s.length() - 1; i <= j; i ++, j--) if (s.charAt (i)! = s.charAt (j)) возвращает false; return true; ' –

ответ

1

Если добавить оператор печати, как это:

if (isPalindrome(pp)) { 
    System.out.format("i = %d, j = %d%n", i, j); 
    return (pp); 
} 

вы получите результат:

i = 995, j = 583 
580085 

Таким образом, ваша программа никогда не приходит в 993 * 913.

+1

Благодаря Кеппилю я понял, что случилось. Два числа, которые умножаются вместе, чтобы получить палиндром, но не самые большие, находятся в начале (или заканчиваются, если вы итерации назад) итерации, поэтому он просто возвращает это вместо самого высокого значения. Обязательно установите условие if, которое проверяет, превышает ли предыдущее значение значение предыдущего, а затем возвращает после циклов, чтобы получить правильный ответ. Спасибо, парни! – user3626745