0

回文数を見つけることができるプログラムを作成しようとしています(3桁の数字を2つ組み合わせたものである必要があり、6桁が含まれていることを望みますが、重要ではありません)。これが私のコードです:

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--;
                }
            }
        }
    }
}

そして私がそれをコンパイルしたい場合:

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の結果:1

4

5 に答える 5

2

ここには2つの問題があります。

  • 他の答えが述べているように、あなたは間違った上限から始めています
  • c奇数から始まり偶数から始まる場合dc決して等しくなりませんd。あなたが使用する必要があります

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

さらに、賢明な使用breakとあなたが持っている必要はまったくreturnないでしょう。podminka

別の余談ですが、関心の分離の問題があります。あなたのメソッドは現在3つのことをします:

  • 特定の方法で数値を繰り返します
  • 彼らがパランドロミックであるかどうかをチェックします
  • 最初に見つけたものを印刷します

それらを分離する必要があります。例えば:

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();

文字列charの配列は、0から長さ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 が 0 より小さいか、文字列の長さを超えると、この例外がスローされることがわかります。デバッガーを使用してコードをデバッグし、なぜこの間違ったパラメーター値を に渡すのかを確認してください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 に答える