簡體   English   中英

程序無輸出,無法找到給定范圍內的所有回文數

[英]No output from program to find all palindrome numbers within a given range

創建一個Java程序以查找和打印ba內的所有回文數, a使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;
            }
        }
    }
}

在此程序中,給出兩個整數后,輸出中不顯示任何內容。

原因是第一個數字(如果不是回文)將在else break;處結束循環else break; ,循環將結束else break; 聲明。 要解決此問題,您也不應在循環中操縱i ,而應操縱它的副本。

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

您是否絕對酸,所以在輸入下限之前先輸入上限,因為我憑直覺先添加了下限,這在任何情況下都不起作用,如果您願意的話,這是更簡單的選擇

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

}

其他人已經建議使用調試器。 這是有道理的,因為您的代碼非常復雜。 (順便說一句,您應該使變量的范圍盡可能小,以使代碼更具可讀性。僅在循環體內使用和聲明變量並在循環外初始化是沒有意義的。)

更好的方法是簡化您的代碼。 您可以將其拆分為多個函數,並為每個函數賦予一個有意義的名稱。

或者,您可以使用完全不同的方法。 回文不只是數字本身的屬性,還在於字符串的表示形式。 那么,為什么不將整個算法基於字符串:

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

我發現您的代碼有兩個問題(不能保證它們是唯一的兩個,但是解決它們至少應該使您更進一步)。

  1. 您在外部循環中將i用作控制變量,然后在內部循環中修改ii=(i-(i%10))/10; )。 因為無論如何您都將i的副本帶入d ,所以有一個簡單的解決方法:在d而不是i上進行修改。
  2. break; 如果第一個嘗試的數字( b )不是回文,則其他部分中的語句將跳出外部循環。 我認為您可以刪除其他部分。

我嘗試輸入102作為上限,輸入99作為下限。 您的程序可以正確打印The 1th Palindrome number between 99 and 102 is 99 ,但是因為i被修改了,所以它進入了無限循環。 所以你在路上。

我同意其他人所說的關於用不太復雜的方法分解代碼的說法。 這還將允許對每種方法進行單元測試,這將有助於查找錯誤。 更好的變量名稱將有助於理解代碼,尤其是當您要求他人查看時。 最后,在需要變量之前不要聲明它,這也有助於提高可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM