Изначально у меня были некоторые проблемы с работой этого кода, но после небольшой настройки я его отладил и готов к работе.
Я прошел несколько ревизий этой программы.Я начал с целочисленных значений только для того, чтобы найти, что число было слишком большим, чтобы поместиться в int.Затем я перешел на BigIntegers, который оказался хлопотным, но работоспособным.Оттуда я переключился на long (как следовало бы сделать с самого начала) и сократил время выполнения моего кода в 8 раз (или более).
Вот код, который есть сейчас:
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;
}
Он работает несколько часов и ничего не нашел.В интернете я увидел, что решение этой головоломки типично, как разбор 560 ГБ данных = /.
Какие-нибудь советы по ускорению этого процесса?
Большое спасибо,
Justian
РЕДАКТИРОВАТЬ:
Оптимизированный код:
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);