java循环的意外行为

时间:2014-05-02 14:46:47

标签: 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 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);

                            }
                        }
                    }
                }
            } 
        }
    }

但输出的是: - 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++) {
然后它得到了正确的答案,我无法理解这个程序的行为? 任何人都可以解释一下吗?

4 个答案:

答案 0 :(得分:5)

你的算法错了。循环应该是这样的:

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

并不是你的算法错了,但我很确定它会两次输出相同的结果。当i = 993且j = 913且i = 913且j = 993时,您将看到结果。但在这种情况下,输出将按i的最大值排序,这不一定会产生最大的产品。  你当前的循环是排列,你需要组合来解决这个问题,即101 * 121等于121 * 101,不要重复相同的乘法两次。

答案 1 :(得分:3)

999 * 999 = 998001

580085小于998001所以我不明白为什么你认为这是一个错误的答案?

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

请注意,为了正确,您应该使用&lt; = 999,而不是&lt; 999为999是有效值。

答案 2 :(得分:0)

可能是整数溢出。 Java中的整数不能超过2 ^ 32,如果是,它们会循环回到-2 ^ 32。建议您使用Longs来处理大数(最多2 ^ 64),或BigInteger如果您的数字超出该数字。

答案 3 :(得分:0)

正如Tim B所说,在运行你的程序后,我也得到 580085 而没有负号,这是一个有效值。

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

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

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

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