Die Herausforderung
Implementieren Sie das Sundaram-Sieb, um die Primzahlen unten zu finden n
. Nehmen Sie eine Ganzzahl n
und geben Sie die folgenden Primzahlen aus n
. Sie können davon ausgehen, dass dies n
immer weniger als oder gleich einer Million sein wird.
Sieb
Beginnen Sie mit einer Liste der Ganzzahlen von
1
bisn
.Entfernen Sie alle Zahlen in dem Formular,
i + j + 2ij
in dem:i
undj
sind kleiner alsn
.j
ist immer größer als oder gleichi
, was größer als oder gleich ist1
.i + j + 2ij
ist kleiner oder gleichn
Multiplizieren Sie die verbleibenden Zahlen mit
2
und addieren Sie1
.
Dies ergibt alle Primzahlen (mit Ausnahme derjenigen 2
, die in Ihrer Ausgabe enthalten sein sollten) kleiner als 2n + 2
.
Hier ist eine Animation des Siebs, mit dem die Primzahlen unten ermittelt werden 202
.
Ausgabe
Ihre Ausgabe sollte jede Primzahl ≤ n
(in aufsteigender Reihenfolge) sein, gefolgt von einer neuen Zeile:
2
3
5
Wo n
ist 5
.
Beispiele
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Eingänge sind mit gekennzeichnet >
.
(i,j)
mit i<=j
, aber das Ergebnis ändert sich nicht, wenn wir diese Anforderung ignorieren. Können wir das tun, um Bytes zu sparen?
i <= j
. Es ist nur ein Teil der Funktionsweise des Siebs. Also ja, Sie können das i <= j
in Ihrem Code weglassen. @xnor
2n+1
) , die nicht von der Form ist 2(i + j + 2ij)+1
- können wir dieses Objekt direkt über die möglichen Primzahlen testen oder auch unseren Code haben die mal 2 plus 1 an einem gewissen Punkt zu tun ?
n
in der ganzen Sache steckt. In der Methodenbeschreibung wird angegeben, dass alle Primzahlen bis generiert werden 2 * n + 2
. In der Eingabe- / Ausgabebeschreibung heißt es jedoch, dass die Eingabe n
und die Ausgabe alle Primzahlen sind n
. Sollen wir also die Methode anwenden, um alle Primzahlen bis zu zu generieren 2 * n + 2
und dann diejenigen fallen zu lassen, die größer sind als n
für die Ausgabe? Oder sollen wir das n
in der Methodenbeschreibung aus der Eingabe berechnen n
?
n=30
fehlt 29 in der Ausgabe.