0

I try to make a program which it can find palindromic number (it has to be pruduct of two 3-digits number and I hope that it contain 6 digit but it is not important). Here is my code:

public class palindromicNumber {
    public static void getPalindromicNumber() {
        boolean podminka = false;
        int test;
        String s;
        for (int a = 999; podminka == false && a > 100; a--) {
            for (int b = 999; podminka == false && b > 100; b--) {
                test = a * b;
                s = Integer.toString(test);
                int c = 0;
                int d = s.length();
                while (c != d && podminka == false) {

                    if (s.charAt(c) == s.charAt(d)) { // I think that problem is here but I can't see what
                        System.out.println(s);
                        podminka = true;
                    }
                    c++;
                    d--;
                }
            }
        }
    }
}

and if I want to compile it :

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(String.java:695)
at faktorizace.palindromicNumber.getPalindromicNumber(palindromicNumber.java:24)
at faktorizace.Faktorizace.main(Faktorizace.java:19)

Java Result: 1

4

5 回答 5

2

这里有两个问题:

  • 正如其他答案所提到的,您从错误的上限开始
  • 如果c以奇数d开始并以偶数开始,则c永远不会等于d。你需要使用

    while (c < d && !podminka) // Prefer !x to x == false
    

此外,明智地使用breakandreturn将避免您必须拥有podminka

另外,你有一个关注点分离问题您的方法目前做了三件事:

  • 以特定方式迭代数字
  • 检查它们是否是回文的
  • 打印它找到的第一个

你应该把它们分开。例如:

public void printFirstPalindrome() {
    long palindrome = findFirstPalindrome();
    System.out.println(palindrome);
}

public long findFirstPalindrome() {
    // Looping here, calling isPalindrome
}

public boolean isPalindrome(long value) {
    // Just checking here
}

我怀疑findFirstPalindrome通常也会采用一些参数。此时,您将拥有更容易编写和测试的方法。

于 2012-07-25T16:37:27.797 回答
1

字符串索引来自[0..length - 1]

更改int d = s.length();int d = s.length() - 1;

更新:顺便说一句,您正在设置podminka何时true

s.charAt(c) == s.charAt(d)

s = 100101例如,如果您将在 while 循环的第一次迭代中终止所有循环,因为第一个字符和最后一个字符相同。

于 2012-07-25T16:35:34.587 回答
0

int d = s.length();

字符串字符数组只会从 0 - length-1 开始。

s.charAt(d)在第一次迭代时总是会越界。

于 2012-07-25T16:36:21.853 回答
0

看一下JDK源代码:

public char charAt(int index) {
    if ((index < 0) || (index >= count)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index + offset];
}

您可以看到当 index 小于零或超过字符串长度时会引发此异常。现在使用调试器,调试你的代码,看看你为什么把这个错误的参数值传递给charAt().

于 2012-07-25T16:37:42.360 回答
0
       public class palindromicNumber {
           public static void getPalindromicNumber(){
              boolean podminka = false;
               int test;
               String s;
            for(int a = 999;podminka == false && a>100; a-- ){
              for(int b = 999;podminka == false && b>100; b-- ){
                test = a*b;
                s = Integer.toString(test); 
                int c = 0;
                int d = s.length();
                while(c!=d && podminka == false){                          

                  if(s.charAt(c)==s.charAt(d - 1)){  
                    System.out.println(s);
                      podminka = true;                                
                }
                      c++;
                       d--;
                 }
                  } 

}

尝试这个!字符串计数从 0 开始!

于 2012-07-25T16:37:46.597 回答