2017-01-22 75 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已被修改进入无限循环。所以你在路上。

我同意别人关于以更简单的方法打破你的代码的评论。这也将允许单元测试每种方法,这将有助于查找错误。更好的变量名将有助于理解代码,尤其是当您要求其他人观看时。最后,在你需要的时候不要声明一个变量,这也有助于可读性。

相关问题