memory - 试图在java中分解longs,内存不足?

标签 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”,它回答正确。我怎样才能让它解析更大的数字?

最佳答案

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

出于好奇,我很想知道这段代码运行了多长时间。它应该不到一毫秒,但我怀疑您的版本需要更长的时间。 (也许我把你的问题弄错了。也许你不是内存不足,而是时间不够)。

如果你尝试其他 Project Euler 问题:不要试图从字面上解决问题。您绝对不需要所有因子的列表来找到一个数字的最大素因子。

关于memory - 试图在java中分解longs,内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835099/

相关文章:

android - 使用声明为 "intent.extras"对象的空变量初始化 "Bundle"

objective-c - 使用 64 位 arm64 构建时 objc_msgSend 函数指针崩溃

java - 因子生成器出现问题

c++ - 奇怪的这个->行为

linux - 理解 OOM 奇怪的行为?

iphone - NSUserDefaults 是否会通过更新 Appstore 中的应用程序而持续存在?

algorithm - 有没有一种算法可以找到最近的只有小因子的数字?

java - HashSets 的 ArrayList 迭代我未指定的索引?

c - 在 C 中设置进程的内存限制(使用 fork 和 exec)

c# - 从内存中删除项目/页面/用户控件