2016-11-27 5 views
0
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」で、それは正しく答えました。より大きな数値を解析するにはどうしたらいいですか?メモリ不足のJavaでlongsを考慮しようとしていますか?

答えて

0

整数オーバーフローに重大な問題があります。 d≥2^31の場合、isInt()は "true"を返しません。一方、dが素数≥2^31の2倍の場合、isPrime()は "true"を返します。

不思議のところ、このコードの実行時間を知りたいと思います。ミリ秒未満でなければなりませんが、あなたのバージョンがもう少し長くなったと思われます。 (たぶんあなたの質問が間違っているかもしれません。たぶんあなたは記憶がなくなっているのではなく、時間外です)。

他のプロジェクトオイラーの問題を試してみると、でなく、という文字通り問題を解決しようとします。あなたは確かに、数の最大の素因数を見つけるためにすべての要素のリストを必要としません。

関連する問題