2014-09-28 130 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