元々、このコードを機能させるのに問題がありましたが、少し調整した後、デバッグして準備が整いました。
私はこのプログラムのいくつかの改訂を経験しました。私は整数値から始めましたが、数値が大きすぎてintに収まらないことがわかりました。次に、BigIntegersに変更しました。これは面倒ですが、実行可能であることがわかりました。そこから、(最初から行うべきだったように)longに切り替えて、コードの実行時間を8分の1(またはそれ以上)に短縮しました。
現在のコードは次のとおりです。
long qNum = 600851475143L;
for (long i = qNum - 1L; i * i >= qNum; i -= 2L)
if (qNum % i == 0 && isPrime(i)) {
System.out.println("Solution:" + i); // for debugging
return i;
}
else
System.out.println(i);// for debugging
return 0L;
と
public static boolean isPrime(long num) {
// unnecessary if statement for this problem (b/c of for loop), but useful for others
if (num % 2 == 0)
return false;
for (long i = 3; i * i <= num; i += 2)
if (num % i == 0)
return false;
return true;
}
何時間も実行されていますが、まだ何も見つかりません。このパズルを解く典型的な方法は、560GBのデータを解析するようなものだとオンラインで見ました=/。
これをスピードアップするためのヒントはありますか?
どうもありがとう、
ユスティニアヌス
編集:
最適化されたコード:
public static long greatestPrimeFactor(ArrayList<Long> factors, long num) {
for (long i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
factors.add(i);
return greatestPrimeFactor(factors, num / i);
}
}
for (int i = factors.size()-1; i > 0; i--)
if (isPrime(factors.get(i)))
return num;
return 0;
}
と
public static boolean isPrime(long num) {
if (num % 2 == 0)
return false;
for (long i = 3; i * i <= num; i += 2)
if (num % i == 0)
return false;
return true;
}
で実行
greatestPrimeFactor(new ArrayList<Long>(), 600851475143L);