Вы тратите время на вычисление всех простых чисел, когда у вас их тоже нет.
- Когда вы найдете первое простое число, попробуйте уменьшить
max
на это простое число, пока оно не перестанет делиться. - Затем продолжайте находить следующее простое число.
- и уменьшайте max, вычленяя это простое число.
- каждый раз проверяйте, равно ли max текущему простому числу. Если это так, все готово.
Предполагая, что вы находите простые числа правильно (и я верю, что вы это делаете), подумайте о следующем:
primes = 2,3,5,7,11,13
max = 99
is 99 divisible by 2 - no, try next prime.
is 99 divisible y 3 - yes
max = 33
is 33 divisble by 3 - yes
max = 11
is 11 divisible by 3 - no
by 5 - no
by 7 - no
by 11 - hey, max is a prime! And it must be the largest because
it can't be reduced anymore.
И, если хотите, при поиске каждого простой множитель max, сохраните его в списке.
Затем умножьте все значения в списке, чтобы увидеть, если продукт == max.
Вот ваш код
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
long max = 600851475143L;
// right here, reduce max by current prime (which starts at 2)
for (long i = 3; i <= max; i += 2){
boolean prime = true;
for (long j = 3; j < Math.sqrt(i); j++){
if (i % j == 0){
prime = false;
break;
}
}
if (prime) {
// right here, reduce max by current prime
}
}
}
}