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 n
siempre será menor o igual a un millón.
Tamiz
Comience con una lista de los enteros de
1
an
.Elimine todos los números que están en la forma
i + j + 2ij
donde:i
yj
son menos quen
.j
siempre es mayor o igual quei
, que es mayor o igual que1
.i + j + 2ij
es menor o igual quen
Multiplica los números restantes por
2
y 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 n
es 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 <= j
en 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? ?
n
hay 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 + 2
y luego eliminar los más grandes que n
para la salida? ¿O deberíamos calcular n
en la descripción del método a partir de la entrada n
?
n=30
falta 29 en la salida.