没有程序输出来查找给定范围内的所有回文数

时间:2017-01-22 15:40:03

标签: java

创建一个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;
            }
        }
    }
}

在这个程序中,给出两个整数后输出中没有任何内容。

4 个答案:

答案 0 :(得分:1)

原因是第一个数字(如果它不是回文结构)将在else break;语句处结束循环。要解决这个问题,你也不应该在它的循环中操纵i,而应该是它的副本。

您可以考虑调试。以比Stackoverflow更快的速度向您显示故障点。

答案 1 :(得分:0)

你在进入下限之前输入超限是否绝对是因为我通过直觉首先添加了下限而且它没有任何方式在这里是一个更简单的灵魂如果你想要

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

}

答案 2 :(得分:0)

其他人已经建议使用调试器。这是有道理的,因为你的代码非常复杂。 (顺便说一句,你应该保持变量的范围尽可能小,以使你的代码更具可读性。当它仅在循环体内使用时,在循环外声明和初始化变量是没有意义的。)

更好的方法是简化代码。您可以将其拆分为多个函数,并为每个函数指定一个有意义的名称。

或者您可以使用完全不同的方法。作为回文并不是数字本身的属性,而是它的字符串表示。那么为什么不将整个算法建立在字符串上呢:

i

答案 3 :(得分:0)

我看到你的代码存在两个问题(不能保证它们只是两个,但解决它们应该至少让你更进一步)。

  1. 您在外部循环中使用i作为控制变量,然后在内部循环(i=(i-(i%10))/10;)内修改i。由于您无论如何都要将d复制到d,因此有一个简单的解决方法:在i而不是break;上进行修改。
  2. 如果尝试的第一个数字(b)不是回文,那么其他部分中的The 1th Palindrome number between 99 and 102 is 99语句将突破外部循环。我想你可以删除else部分。
  3. 我尝试输入102为上限,99为更低。您的程序正确打印i,但之后因为{{1}}已被修改进入无限循环。所以你在路上。

    我同意其他人所说的关于在不太复杂的方法中破坏代码的内容。这也将允许单元测试每个方法,这将有助于找到错误。更好的变量名称将有助于理解代码,尤其是当您要求其他人查看时。最后,在需要之前不要声明变量,这也有助于提高可读性。