[英]No output from program to find all palindrome numbers within a given range
創建一個Java程序以查找和打印b
和a
內的所有回文數, a
使a<3000
, b<3000
和b<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);
}
}
我發現您的代碼有兩個問題(不能保證它們是唯一的兩個,但是解決它們至少應該使您更進一步)。
i
用作控制變量,然后在內部循環中修改i
( i=(i-(i%10))/10;
)。 因為無論如何您都將i
的副本帶入d
,所以有一個簡單的解決方法:在d
而不是i
上進行修改。 break;
如果第一個嘗試的數字( b
)不是回文,則其他部分中的語句將跳出外部循環。 我認為您可以刪除其他部分。 我嘗試輸入102作為上限,輸入99作為下限。 您的程序可以正確打印The 1th Palindrome number between 99 and 102 is 99
,但是因為i
被修改了,所以它進入了無限循環。 所以你在路上。
我同意其他人所說的關於用不太復雜的方法分解代碼的說法。 這還將允許對每種方法進行單元測試,這將有助於查找錯誤。 更好的變量名稱將有助於理解代碼,尤其是當您要求他人查看時。 最后,在需要變量之前不要聲明它,這也有助於提高可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.