Поиск N простого числа. На вход идет порядковый номер, а ответе само простое число. Например (входные/выходные данные):
1
=>1
2
=>2
4
=>5
6
=>11
Число 1 по определению не считается простым числом, но указано в качестве примера входных параметров, поэтому отталкиваемся от этого.
В постановке не указан способ ввода значения, реализовано два: аргументом запуска, в случае отсутствия - ввод через System.in.
В постановке не указано никаких ограничений на интервал значений, а также располагаемые ресурсы (память, скорость и количество ядер процессора),
требований на параллелизацию. Сделано несколько реализаций, все однопоточные. Основная реализация: Simple.arraySimpleInt
SimpleTest - набор простых unit-тестов, где проверяются все реализации вместе, либо по отдельности. Для больших значений тесты разделены для удобства засечения времени исполнения.
Самая простая реализация для случая, когда у нас мало памяти, но много времени и процессорного ресурса. Основана на переборе всех делителей от 3 до sqrt(n). Перебираются нечетные числа. Однопоточный режим. Используется тип int, предел значения простого числа Integer.MAX_VALUE
Аналогично basicSimpleInt, но использует тип long для значения. Работает медленно, зато за конечное время может вычислить требуемое значение, не вылезая из пределов ресурсов.
Создает массив в памяти и заполняет его вычисленными простыми числами по мере вычисления.
Соответственно его же использует для перебора делителей. Расход памяти (N * 4) байт
Однопоточный режим. Используется тип int, предел значения простого числа Integer.MAX_VALUE/
Вычисленное максимальное значение: 105097566
=> 2147483647
. Кстати, это Integer.MAX_VALUE
. (Время вычисления 30 минут.)
Аналогично arraySimpleInt, только не вычисляет квадратный корень, а наоборот инкрементально возводит в квадрат при прохождении очередного порога.
Не дает заметного прироста производительности по сравнению с sqrt
.
Аналогично arraySimpleInt, но использует тип long для значения. Работает примерно в три раза медленнее, чем int на моем маке, зато позволяет работать в более широком диапазоне.
./gradlew
java -jar build/libs/c-simple-1.0-SNAPSHOT.jar 123
java -jar build/libs/c-simple-1.0-SNAPSHOT.jar