Соревнование
Внедрите сито Sundaram для поиска простых чисел ниже n
. Возьмите входное целое число n
и выведите простые числа ниже n
. Можно предположить, что n
всегда будет меньше или равен одному миллиону.
Сито
Начните со списка целых чисел от
1
доn
.Удалите все числа в форме
i + j + 2ij
где:i
иj
меньше чемn
.j
всегда больше или равноi
, что больше или равно1
.i + j + 2ij
меньше или равноn
Умножьте оставшиеся числа на
2
и добавьте1
.
Это даст все простые числа (кроме тех 2
, которые должны быть включены в ваш вывод) меньше, чем 2n + 2
.
Вот анимация сита, используемого для поиска простых чисел ниже 202
.
Выход
Ваш вывод должен быть каждым простым целым числом ≤ n
(в порядке возрастания), за которым следует новая строка:
2
3
5
Где n
находится 5
.
Примеры
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Входы обозначены >
.
(i,j)
с i<=j
, но результат не меняется, если мы игнорируем это требование. Можем ли мы сделать это, чтобы сохранить байты?
i <= j
. Это только часть того, как работает сито. Так что да, вы можете не указывать i <= j
в своем коде. @xnor
2n+1
), которые не имеют формы 2(i + j + 2ij)+1
- можем ли мы проверить это свойство непосредственно на потенциальных простых числах или наш код должен выполнить времена 2 плюс 1 в какой-то момент ?
n
во всем этом. В описании метода говорится, что он сгенерирует все простые числа до 2 * n + 2
. Но в описании ввода / вывода говорится, что вход есть n
, а выходные данные все простые n
. Так нужно ли применять метод для генерации всех простых чисел до 2 * n + 2
, а затем отбрасывать те, которые больше, чем n
для выходных данных? Или мы должны рассчитать n
в описании метода из ввода n
?
n=30
отсутствующим 29 в выводе.