Java中的算术错误

时间:2013-03-05 00:43:32

标签: java

我最近开始学习Java,现在我正在尝试解决一些Eulerproject问题。

任务是: 600851475143号码的最大素数因素是什么?

我能够创建此代码,但是我收到错误:

代码

package exercises;
import java.util.ArrayList;

public class Euler3 {

    // Main code
    public static void main(String[] args) {


        System.out.println( getPrimeFactors(15) );
    }

    // Code for breaking a number to prime factors
    public static ArrayList getPrimeFactors(int n){

        ArrayList factors = new ArrayList();

        int d = 2;

        while(n > 1 ){
            while(n%d == 0 ){
                factors.add(d);
                n /= d;
            }
            d +=d;
        }

        return factors;
    }

}

错误:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at exercises.Euler3.getPrimeFactors(Euler3.java:22)
    at exercises.Euler3.main(Euler3.java:9)

我做错了什么? 感谢

3 个答案:

答案 0 :(得分:3)

对于一个非常天真的解决方案,请尝试将行d += d更改为d += 1

答案 1 :(得分:3)

d已溢出,我在n内打印dwhile (n > 1)

    15 2
    15 4
    15 8
    15 16
    15 32
    15 64
    15 128
    15 256
    15 512
    15 1024
    15 2048
    15 4096
    15 8192
    15 16384
    15 32768
    15 65536
    15 131072
    15 262144
    15 524288
    15 1048576
    15 2097152
    15 4194304
    15 8388608
    15 16777216
    15 33554432
    15 67108864
    15 134217728
    15 268435456
    15 536870912
    15 1073741824
    15 -2147483648
    15 0

我认为解决方案是d++,而不是d+=d - 现在你只检查2的幂,而不是所有连续的整数。

答案 2 :(得分:1)

问题是您的d越过Integer.Max限制并且溢出。