El reto
Implemente el tamiz Sundaram para encontrar los números primos a continuación n. Tome un entero de entrada n, y envíe los números primos a continuación n. Puede suponer que nsiempre será menor o igual a un millón.
Tamiz
Comience con una lista de los enteros de
1an.Elimine todos los números que están en la forma
i + j + 2ijdonde:iyjson menos quen.jsiempre es mayor o igual quei, que es mayor o igual que1.
i + j + 2ijes menor o igual quen
Multiplica los números restantes por
2y suma1.
Esto producirá todos los números primos (excepto 2, que deben incluirse en su salida) menos que 2n + 2.
Aquí hay una animación del tamiz que se usa para encontrar primos a continuación 202.

Salida
Su salida debe ser cada número entero primo ≤ n(en orden ascendente) seguido de una nueva línea:
2
3
5
Donde nes 5.
Ejemplos
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Las entradas se denotan por >.
(i,j)con i<=j, pero el resultado no cambia si ignoramos este requisito. ¿Podemos hacerlo para guardar bytes?
i <= j . Es solo parte de cómo funciona el tamiz. Entonces sí, puede omitir el i <= jen su código. @xnor
2n+1) que no son de la forma 2(i + j + 2ij)+1: ¿podemos probar esta propiedad directamente en los números primos potenciales o nuestro código tiene que hacer los tiempos 2 más 1 en algún momento? ?
nhay en todo el asunto. En la descripción del método, dice que generará todos los primos hasta 2 * n + 2. Pero en la descripción de entrada / salida, dice que la entrada es n, y la salida se prepara hasta n. Entonces, ¿se supone que debemos aplicar el método para generar todos los primos 2 * n + 2y luego eliminar los más grandes que npara la salida? ¿O deberíamos calcular nen la descripción del método a partir de la entrada n?
n=30falta 29 en la salida.