java循环的意外行为

java循环的意外行为,java,math,Java,Math,我遇到了这样的问题:- A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99. Find the largest palindrome made from the product of two 3-digit numbers. 为了解决这个问题,我编写了如下程序: public voi

我遇到了这样的问题:-

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
为了解决这个问题,我编写了如下程序:

public void palindrome(){
        int n=0;
        for (int i = 100; i < 999; i++) { // I belive that largest palindrome is between 100 and 999
            for (int j = 100; j <999; j++) {
                n=i*j;
                if(n>100000){
                    if(n/100000==n%10){
                        if(n/10000-(n/100000)*10==(n%100)/10){
                            if(n/1000-(n/10000)*10==(n%1000)/100){
                                System.out.println(n);

                            }
                        }
                    }
                }
            } 
        }
    }
public void回文(){
int n=0;
对于(inti=100;i<999;i++){//我相信最大回文数在100到999之间
对于(整数j=100;j 100000){
如果(n/100000==n%10){
如果(n/10000-(n/100000)*10==(n%100)/10){
如果(n/1000-(n/10000)*10==(n%1000)/100){
系统输出println(n);
}
}
}
}
} 
}
}
但输出是:-580085 如果我像这样改变循环

for (int i = 900; i < 999; i++) { // I belive that largest palindrome is between 900 and 999
                for (int j = 900; j <999; j++) {
for(inti=900;i<999;i++){//我相信最大回文数在900到999之间

对于(int j=900;j这可能是整数溢出。Java中的整数不能超过2^32,如果超过2^32,则返回到-2^32。建议在处理大数(最多2^64)的情况下使用long,或者在数字超过2^64的情况下使用biginger

999*999=998001

580085小于998001,所以我不明白你为什么认为这是一个不正确的答案

很有可能这是一个正确的答案,如果只从900到999循环,你只是从可能的集合中移除它,移除给出该结果的乘法的一侧或两侧


请注意,为了正确起见,您应该使用timb所说的,在运行您的程序之后,我还得到了580085,没有负号,这是一个有效值

此外,您的代码将输出所有回文值,而不仅仅是最大值。在第一种情况下,最后一个值是580085

减少循环范围时,最后一个值为最大值906609

因此,您应该检查当前计算的回文是否比最新的回文大


这将为您提供两个循环的正确答案。

您的算法错误。循环应该是这样的:

    public void palindrome(){
    int n=0,largest=0;
    for (int i = 100; i <= 999; i++) { // I belive that largest palindrome is between 100 and 999
        for (int j = i+1; j <=999; j++) {
            n=i*j;
            if(n>100000){
                if(n/100000==n%10){//first and last
                    if((n/10000)%10==(n%100)/10){ //second and fifth
                        if((n/1000)%10==(n%1000)/100){ //third and fourth
                            if(n>largest) largest=n;

                        }
                    }
                }
            }
        } 
    }
    System.out.println(largest);
}
public void回文(){
int n=0,最大值=0;
对于(int i=100;i最大)max=n;
}
}
}
}
} 
}
系统输出打印项次(最大);
}
这并不是说你的算法错了,但我很确定它会两次输出相同的结果。当I=993和j=913以及I=913和j=993时,你会看到你的结果。但在这种情况下,输出将按I的最大值排序,这不一定会产生最大的乘积。
您当前的循环是置换,您需要组合来解决此问题,即101*121等于121*101,不要重复相同的乘法两次。

但是为什么。如果您有两个前4位数字并将它们相乘,您得到的1000000仍然在范围内。第二个版本的运行速度比第一个版本快100倍;我的hunch是因为您没有让代码运行到完成阶段,如果您等待足够长的时间,它将输出正确的答案。此外,请缩进您的代码,这很难阅读。您的回文检查代码中可能存在错误,我现在不想对此进行推理;您可以将其转换为字符串
s
and检查
s.equals(s.reverse())
。您的问题是输出所有值,而不仅仅是最大值。因此,在第一种情况下,最后一个值是580085。更多详细信息如下。我同意您的看法,但580085不是正确答案,因为正确答案是906609。它只是循环的第二个版本