Le défi
Implémentez le tamis Sundaram pour trouver les nombres premiers ci-dessous n
. Prenez un entier en entrée n
, et sortez les nombres premiers ci-dessous n
. Vous pouvez supposer qu'il n
sera toujours inférieur ou égal à un million.
Tamis
Commencez par une liste des entiers de
1
àn
.Supprimez tous les numéros du formulaire
i + j + 2ij
où:i
etj
sont inférieurs àn
.j
est toujours supérieur ou égal ài
, ce qui est supérieur ou égal à1
.i + j + 2ij
est inférieur ou égal àn
Multipliez les nombres restants par
2
et ajoutez1
.
Cela donnera tous les nombres premiers (sauf ceux 2
qui devraient être inclus dans votre sortie) inférieurs à2n + 2
.
Voici une animation du tamis utilisé pour trouver les nombres premiers ci-dessous 202
.
Production
Votre sortie doit être chaque entier premier ≤ n
(dans l'ordre croissant) suivi d'une nouvelle ligne:
2
3
5
Où n
est 5
.
Exemples
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Les entrées sont désignées par >
.
(i,j)
qu'avec i<=j
, mais le résultat ne change pas si nous ignorons cette exigence. Pouvons-nous le faire pour économiser des octets?
i <= j
. Cela fait juste partie du fonctionnement du tamis. Alors oui, vous pouvez laisser de côté le i <= j
dans votre code. @xnor
2n+1
) qui ne sont pas de la forme2(i + j + 2ij)+1
- peut - on tester cette propriété directement sur les nombres premiers potentiels ou ne notre code ont à faire les temps 2 plus 1 à un moment donné ?
n
y a dans tout ça. Dans la description de la méthode, il indique qu'il générera tous les nombres premiers jusqu'à 2 * n + 2
. Mais dans la description entrée / sortie, il est dit que l'entrée est n
, et la sortie est tout d'abord jusqu'à n
. Sommes-nous donc censés appliquer la méthode pour générer tous les nombres premiers jusqu'à 2 * n + 2
, puis supprimer ceux plus grands que n
pour la sortie? Ou devrions-nous calculer la n
dans la description de la méthode à partir de l'entrée n
?
n=30
manque 29 dans la sortie.