2017-01-22 20 views
0

內的所有迴文號碼創建一個Java程序查找和內ba 這樣a<3000b<3000b<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; 
      } 
     } 
    } 
} 

在這個程序中,沒有出現在輸出給兩個整數後。

+1

嘗試調試器。如果此時此刻對您來說太大了一步,可以嘗試使用'System.out.println()'調用來告訴您關鍵位置的變量值,並檢查它們是否與預期一致。 –

回答

1

原因是第一個數字,如果它不是迴文,將結束else break;語句的循環。要解決這個問題,你不應該在其循環中操作i,而應該在其中拷貝它。

您可能會考慮調試。向您顯示比Stackoverflow更快的故障點。

0

你絕對酸味你,因爲我是憑直覺先加入下限,並沒有在這裏工作的任何方式是一個簡單的soultion如果你想

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

}

進入下限之前進入UPER限制
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

我看到兩個問題與您的代碼(不能保證它們是僅有的兩個,但解決這些問題應該讓你在至少一步)。

  1. 你在你的外循環使用i作爲控制變量,然後你正在修改i您的內環(i=(i-(i%10))/10;)內。由於您無論如何都將i複製到d,因此有一個簡單的解決方法:在d而不是i上進行修改。
  2. 如果您嘗試的第一個數字(b)不是迴文,您的其他部分中的break;語句將跳出外部循環。我認爲你可以刪除其他部分。

我試着輸入102作爲上限,99作爲下限。您的程序正確打印The 1th Palindrome number between 99 and 102 is 99,但後來因爲i已被修改進入無限循環。所以你在路上。

我同意別人關於以更簡單的方法打破你的代碼的評論。這也將允許單元測試每種方法,這將有助於查找錯誤。更好的變量名將有助於理解代碼,尤其是當您要求其他人觀看時。最後,在你需要的時候不要聲明一個變量,這也有助於可讀性。

相關問題