2014-09-28 57 views
0

我知道我的isPalindrome方法的工作,因爲當我在906609插上它返回true,我知道,在某些時候我Problem4方法乘以993和913一起,這將產生906609,但由於某些原因,它一直等待,直到580085返回號碼。我究竟做錯了什麼?我只是無法得到它的工作:(項目歐拉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 2014-09-28 20:32:42

+0

是的,它幾乎是巴洛克式編碼的傑作。 – 2014-09-28 20:39:19

+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))return false;返回true;' – 2014-09-28 20:44:00

回答

1

如果添加一個print語句是這樣的:

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

你得到的結果是:

i = 995, j = 583 
580085 

所以,你的程序還沒有出現,993 * 913

+1

感謝Keppil我意識到什麼是錯的。這兩個數相乘得到一個迴文,但不是最大的是在迭代開始時(或者結束時,如果你正在迭代),所以它只是返回而不是最高值。確保放置一個if條件來檢查下一個值是否高於先前的值,然後在循環之後返回以獲得正確的答案。多謝你們! – user3626745 2014-09-28 20:47:45