试图在java中考虑长时间,内存不足?

时间:2016-11-27 23:27:20

标签: memory crash factoring

public static void main(String[] args){
    System.out.println("The largest prime factor of 600851475143 is "+largest(primeFactors(600851475143.0)));
}
public static ArrayList<Integer> factor(double n){
    ArrayList<Integer> factors = new ArrayList<Integer>();
    for(long i = 1; i<=n; i++){
        if(isInt(n/i)){
            factors.add((int)i);
        }
    }
    return factors;
}
public static ArrayList<Integer> primeFactors(double n){
    ArrayList<Integer> factors = factor(n);
    ArrayList<Integer> primes = new ArrayList<Integer>();
    for(int f : factors){
        if(isPrime(f)){
            primes.add(f);
        }
    }
    return primes;
}
public static boolean isInt(double d){
    return (d==(int)d);
}
public static boolean isPrime(double d){
    return (factor(d).size()<=2);
}
public static long largest(ArrayList<Integer> integers){
    int max = 1;
    for(int i = 0; i<integers.size(); i++){
        if(integers.get(i)>max){
            max=integers.get(i);
        }
    }
    return max;
}

运行此代码会导致我的java抱怨它内存不足?我并不认为这是一个难以解决的问题,因为我的代码是有意义的,适用于较小的数字,但它似乎有这个问题。我的代码中是否存在导致其崩溃的问题,或者仅仅是我的代码(或者一般的java)不是内存效率?从这个较大的数字中减去数字可以完成的最大数字是“60085147.0”,它正确回答。如何解析更大的数字呢?

1 个答案:

答案 0 :(得分:0)

整数溢出存在严重问题。如果d≥2^ 31,isInt()永远不会返回“true”。另一方面,如果d是素数≥2^ 31的两倍,则isPrime()将返回“true”。

出于好奇,我想知道这段代码运行了多长时间。它应该不到一毫秒,但我怀疑你的版本花了更长的时间。 (也许我的问题出错了。也许你的记忆力不足,但时间不够了)。

如果您尝试其他Project Euler问题:尝试从字面上解决问题。您肯定不需要所有因素的列表来查找数字的最大素数因子。