Raku-Kurs / Anhang 🆕 / Alles zusammenbringen / Gemischte Mini-Projekte / Exercises / Sieb des Eratosthenes
Lösung: Sieb des Eratosthenes
Hier ist eine mögliche Lösung der Aufgabe.
Code
my $limit = 30;
my %composite;
for 2 .. $limit -> $i {
next if %composite{$i};
for ($i², $i² + $i ... $limit) -> $multiple {
%composite{$multiple} = True;
}
}
say (2..$limit).grep({ !%composite{$_} });🦋 Du findest den Quellcode in der Datei sieve.raku.
Ausgabe
(2 3 5 7 11 13 17 19 23 29)Kommentare
Statt einer Liste von Flaggen merkt sich
%composite, welche Zahlen gestrichen wurden. Eine Zahl, die noch fehlt, wenn sie an der Reihe ist, ist prim.Für jede Primzahl
$iwerden ihre Vielfachen als Folge$i², $i² + $i ... $limiterzeugt und als zusammengesetzt vermerkt. Bei$i²zu beginnen überspringt Vielfache, die kleinere Primzahlen schon erledigt haben.Das ist eine einzelne Folge, kein
for-Kopf im C-Stil. Der Operator...nimmt die ersten beiden Werte, ermittelt die Schrittweite zwischen ihnen und läuft bis zur Grenze weiter. Für$i=3heißt das, bei9zu beginnen, dann12, die Schrittweite ist also3, und die Schleife geht die ganze Liste durch:my $i = 3; say ($i², $i² + $i ... 30); # (9 12 15 18 21 24 27 30)
forbekommt also eine Liste zum Durchlaufen —9, 12, 15, …— statt dreier getrennter Klauseln.$i²quadriert die Zahl mithilfe einer hochgestellten Unicode-Ziffer. Raku nimmt alle drei Schreibweisen$i * $i,$i ** 2und$i²an — sie berechnen genau denselben Wert, wählen Sie also, was sich für Sie am besten liest. Die hochgestellten Ziffern (²,³, …) sind gewöhnliche Zeichen, die Sie unmittelbar in den Quelltext tippen oder einfügen können.