Java程序终止没有错误?

时间:2014-05-12 11:03:43

标签: java

我试图制作一个程序,找到最大的回文,它是两个3位数字的乘积。这就是我现在所拥有的(我是编程新手):

    int num1 = 0;
    int num2 = 0;
    int product = 0;
    int tempProd1 = 0;
    int tempProd2 = 0;
    int tempProd3 = 0;
    int tempProd4 = 0;
    int tempProd5 = 0;
    int tempProd6 = 0;
    String prodCheck1 = "";
    String prodCheck2 = "";

    while (num1 < 1000){
        while (num2 < 1000){
            product = num1 * num2;
            prodCheck1 = Integer.toString(product);

            tempProd1 = product % 10;
            product = product / 10;
            tempProd2 = product % 10;
            product = product / 10;
            tempProd3 = product % 10;
            product = product / 10;
            tempProd4 = product % 10;
            product = product / 10;
            tempProd5 = product % 10;
            product = product / 10;
            tempProd6 = product % 10;
            product = product / 10;             

            prodCheck2 = "tempProd1" + "tempProd2" + "tempProd3" + "tempProd4" + "tempProd5" + "tempProd6";

            if (prodCheck1 == prodCheck2){
                System.out.println(prodCheck1);
            }   
            num2++;
        }
        num1++;
    }   

事情是,每当我尝试运行它时,它都会终止而不会出错。有人可以解释我做错了吗?

编辑:谢谢大家,最后解决了。答案是853358,如果有人想知道的话。

编辑:实际上,这个数字是906609。

3 个答案:

答案 0 :(得分:1)

我立刻注意到的一件事是,在内循环的第一次迭代之后,num2是1000,因此内循环在外循环的剩余999次迭代中什么都不做。您必须将num2重置为0.

还考虑使用&#34; for&#34;而是循环;它们旨在防止出现这种错误:

for (int num1=0; num1<1000; num1++) {
  ...
}

另一个问题是回文检查是错误的。你无法将字符串与==进行比较(它测试对象标识,而不是字符串相等 - 你必须使用equals()代替)。但即使这是错误的,因为prodCheck2是&#34; tempProd1tempProd2 ...&#34;并且不包含实际数字。检查回文的最简单方法是:

if (tempProd1 == tempProd6 && tempProd2 == tempProd5 && tempProd3 == tempProd$) {
  ...
}

答案 1 :(得分:0)

if (prodCheck1 == prodCheck2){
            System.out.println(prodCheck1);
}   

是仅基于prodCheck1和prodCheck2的身份相等的比较。将该代码重写为:

if (prodCheck1.equals()){
            System.out.println(prodCheck1);
} 

使用值相等,对于相同的字符串将返回true。

答案 2 :(得分:0)

字符串的等于方法

这里有几个问题。不应使用第一个==来比较字符串。 You should use string.equals(otherString);

收缩词

其次,当您想要组合值

时,您似乎正在组合单词
prodCheck2 = "tempProd1" + "tempProd2" + "tempProd3" + "tempProd4" + "tempProd5" + "tempProd6;

将给出

prodCheck2 = "tempProd1tempProd2tempProd3tempProd4tempProd5tempProd6";

总是。事实上,那些单词碰巧与你的一些变量具有相同的名称,这对java没有任何影响。

有许多更好的方法可以连接整数。但最简单的可能如下

prodCheck2 = tempProd1 + "" + tempProd2 + "" +tempProd3 + "" +tempProd4 + "" +tempProd5 + "" +tempProd6";

使用while时何时会更好

while (num1 < 1000){
              while (num2 < 1000){
              ......
              num2++;
        }
        num1++;
}

此代码永远不会减少num2,这意味着num2在num1 = 0时变为1-> 1000,然后从此开始保持为1000。我猜这不是你想要的。我们可以修复while循环,但实际上这就是for循环的用途

for(int num1=0;num1<1000;num1++){
     for(int num2=0;num2<1000;num2++){
         //code as before, no need to inciment or reset num1 or num2 inside the loop
     }
}

不会破坏您的代码的问题

您正在以非常大的范围声明所有变量。例如,tempProd1在所有循环之外声明,仅在内循环内需要。尽可能在最小范围内声明变量。这将捕获我们在这里找到的错误。如果您在第一个循环中对其进行了延迟,那么批评num2无法意外地进行非重置