Die Herausforderung
Implementieren Sie das Sundaram-Sieb, um die Primzahlen unten zu finden n. Nehmen Sie eine Ganzzahl nund geben Sie die folgenden Primzahlen aus n. Sie können davon ausgehen, dass dies nimmer weniger als oder gleich einer Million sein wird.
Sieb
Beginnen Sie mit einer Liste der Ganzzahlen von
1bisn.Entfernen Sie alle Zahlen in dem Formular,
i + j + 2ijin dem:iundjsind kleiner alsn.jist immer größer als oder gleichi, was größer als oder gleich ist1.
i + j + 2ijist kleiner oder gleichn
Multiplizieren Sie die verbleibenden Zahlen mit
2und 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 nist 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 <= jin 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 ?
nin 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 nund die Ausgabe alle Primzahlen sind n. Sollen wir also die Methode anwenden, um alle Primzahlen bis zu zu generieren 2 * n + 2und dann diejenigen fallen zu lassen, die größer sind als nfür die Ausgabe? Oder sollen wir das nin der Methodenbeschreibung aus der Eingabe berechnen n?
n=30fehlt 29 in der Ausgabe.