Змагання
Реалізувати сито Сундара для знаходження простих чисел нижче 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 у висновку.