2017-01-22 10 views
0

内のすべての回文数はb内のすべての回文番号を検索し、印刷するためのJavaプログラムを作成して見つけるためのプログラムからの出力とa
私のアプローチ: - このプログラムで
与えられた範囲

import java.util.*; 
class PalinDrome_Within_A_Range_Of_Two_Numbers{ 

    public static void main(String args[]){ 
     Scanner sc= new Scanner(System.in); 
     System.out.println("Enter an upper limit<3000"); 
     int a=sc.nextInt(); 
     System.out.println("Enter a lower limit <3000,upper limit"); 
     int b=sc.nextInt(); 

     int c=0; 
     int d,e,f,j; 
     for(int i=b;i<=a;i++){ 
      j=(int)(Math.log10(i) + 1); 
      e=0; 
      f=0; 
      d=i; 
      for(int k=1;k<=j;k++){ 
       f=i%10; 
       f=(int)(f*(Math.pow(10,(j-k)))); 
       i=(i-(i%10))/10; 
       e=e+f; 
      } 
      if(e==d){ 
       c=c+1; 
       System.out.println("The "+c+"th Palindrome number between "+b+" and "+a+" is "+d); 
      } 
      else{ 
       break; 
      } 
     } 
    } 
} 

、何も2つの整数を与えた後、出力に表示されません。

+1

デバッガをお試しください。これが現時点では大きすぎる場合は、 'System.out.println()'を呼び出して重要な場所のvariblesの値を伝え、それらが期待どおりになっているかどうかを確認してください。 –

答えて

1

なぜなら、最初の数字が回文でなければ、else break;ステートメントでループを終了するからです。問題を解決するには、そのループ内でiも操作しないでください。そのコピーはコピーしてください。

デバッグについて考えるかもしれません。 Stackoverflowより速く障害点を表示します。私は直感で最初の下限値を追加し、それがここにどのような方法がうまくいかなかったので、

0

はあなたが下限に入る前にUPER制限を入力絶対に酸っぱいですあなたは

public class PalinDrome_Within_A_Range_Of_Two_Numbers { 

public static void main(String args[]){ 
    Scanner sc= new Scanner(System.in); 
    System.out.println("Enter an upper limit<3000"); 
    int a=sc.nextInt(); 
    System.out.println("Enter a lower limit <3000,upper limit"); 
    int b=sc.nextInt(); 

    int c=0; 
    int d,e,f,j; 
    for(int i=b;i<=a;i++){ 
     String num = String.valueOf(i); 
     String reversNum = getReversStr(num); 
     if(num.equals(reversNum)){ 
      System.out.println(num); 
     } 
    } 
} 

private static String getReversStr(String num) { 
    char[] chars = num.toCharArray(); 
    char[] revers = new char[chars.length]; 
    for(int i = chars.length;i>0;i--) 
     revers[chars.length-i]=chars[i-1]; 
    return new String(revers); 
} 

}

をしたい場合は単純soultionです
0

他にも既にデバッガの使用を提案しています。あなたのコードは非常に複雑なので意味があります。 (ちなみに、変数のスコープを可能な限り小さくしてコードを読みやすくする必要があります。ループ本体内でのみ変数を宣言して初期化することは意味がありません)

より良いアプローチは、コードを単純化することです。複数の関数に分割し、それぞれに意味のある名前を付けることができます。

まったく別のアプローチを使用することもできます。パリンドロームであることは、数字自体の性質ではなく、文字列表現の性質です。

for (int i = b; i <= a; i++) { 
    String num = String.valueOf(i); 
    String reverse = new StringBuilder(num).reverse().toString(); 
    if (num.equals(reverse)) { 
     System.out.println(i); 
    } 
} 
0

は、私はあなたのコードを持つ2つの問題を参照してください(彼らは2つだけであることを保証なし、しかし少なくとも、さらに一歩あなたを取得する必要があり、それらを解決する):だから、なぜ文字列に全体のアルゴリズムを基づきません。

  1. あなたの外側のループの制御変数としてiを使用している、とあなたはあなたの内側のループ(i=(i-(i%10))/10;)内iを変更しています。とにかくiのコピーをdに持っているので、簡単な修正があります:iの代わりにdの修正を行います。
  2. 最初の数字が試行された場合(b)は回文ではない場合、他の部分の文はの外側のループから脱落します。私はあなたがちょうどelse部分を削除することができると思う。

上限を102、99を低くしてみました。プログラムはThe 1th Palindrome number between 99 and 102 is 99を正しく出力しますが、iが変更されたため、無限ループに入ります。あなたは途中です。

私は他の人があなたのコードをもっと複雑ではない方法で打ち切ったと言ったことに同意します。これにより、各メソッドのユニットテストが可能になり、バグの特定に役立ちます。より良い変数名は、コードを理解するのに役立ちます。最後に、必要になるまで変数を宣言しないでください。これは読みやすさにも役立ちます。

関連する問題