Gunnar Bittersmann: Lösung

Beitrag lesen

@@1unitedpower

Ich hatte mich zuerst an die Aufgabe für Normalos gemacht. Allerdings etwas abgewandelt (so normal bin dann doch nicht 😜): die Funktion bekommt kein mit Zahlen vorausgefülltes Array als Parameter, sondern die Zahl max, bis zu der alle Primzahlen ermittelt werden sollen. Das Array wird innerhalb der Funktion selbst erzeugt und beherbergt keine Zahlen, sondern boolesche Werte, anfangs mit true gefüllt. 0 und 1 sind keine Primzahlen; flags[0] und flags[0] werden auf false gesetzt.

Dann beginnt das Sieben: das jeweils nächste Element, das true ist, steht für eine Primzahl; alle Vielfachen davon werden auf false gesetzt. Man muss nicht ewig sieben, als mögliche Primfaktoren kommen nur Primzahlen bis √max in Betracht.

	for (
		let currentPrime = 2;
		currentPrime <= sqrtMax;
		currentPrime = flags.indexOf(true, currentPrime + 1)
	)
	{
		for (let i = 2 * currentPrime; i < flags.length; i += currentPrime)
		{
			flags[i] = false;
		}
	}

Am Ende ist flags[i] nur noch für diejenigen i true, die Primzahlen sind; diese werden in einem zweiten Array gesammelt.

Das Ganze zu sehen in diesem Pen.

Eine Optimierung besteht nun darin, die 2 gesondert zu nehmen und im Weiteren nur noch die ungeraden Zahlen zu betrachten. Das Array ist dann nur noch halb so groß. Eine Hilfsfunktion getNumberFromIndex() stellt die Zuordnung Index–Zahl her. Zu sehen in [jenem Pen](https://codepen.io/gunnarbittersmann/pen/JebxNp ?editors=0012).

An die lächerliche Geschwindigkeit – äh wahnsinnige Geschwindigkeit – äh enorme Schwierigkeit hab ich mich später gewagt; dazu später mehr.

LLAP 🖖

--
„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann