Я думаю, что ваша программа вообще не зависает, просто требуется много времени, чтобы выполнить свою работу.
По мере увеличения чисел количество времени, необходимое для их проверки, увеличивается пропорционально ихквадратный корень.Кроме того, расстояния между простыми числами тем больше, чем больше число.Соединив их вместе, скорость, с которой будут найдены простые числа, довольно быстро иссякнет.
Вы подключили отладчик к своей программе и приостановили выполнение, чтобы проверить локальные переменные и посмотреть, где они находятся?Вы даже вставили System.out.println("About to calculate for " + i);
?Откуда вы знаете, что ваша программа «просто останавливается»?
Первым шагом должно быть некоторое исследование того, что на самом деле делает ваша программа.Если вы выводите временные метки с помощью сообщений println, вы также можете получить представление о том, как уменьшается скорость проверки каждого отдельного числа, и, таким образом, когда вы определяете паузу, вы можете получить приблизительную оценку того, сколько времени займет текущая проверка.*
Кроме того, ваша программа никогда не завершится, поскольку у вас есть бесконечный внешний цикл.Условием завершения цикла for
является i <= Integer.MAX_VALUE
, что означает, что он будет работать до тех пор, пока не найдет i
такой, что i > Integer.MAX_VALUE
.Можете ли вы назвать значение для i
, где оно будет иметь значение true?