Zurück zu den Herausforderungen
Mittel 0 gelöst 0% Erfolgsquote

Primzahlen mit einem Sieb auflisten

Finde Primzahlen bis zu einem Grenzwert, indem zusammengesetzte Vielfache markiert werden.

Das lernst du

  • Zusammengesetzte Zahlen in einem booleschen Array markieren
  • Das Streichen bei p × p beginnen
  • Die übrigen Primzahlen sammeln

Problem

Gib alle Primzahlen von 2 bis einschließlich limit zurück. Eine Primzahl ist eine ganze Zahl größer als 1, die nur durch 1 und sich selbst teilbar ist. Verwende das Sieb-Prinzip: Behalte die nächste unmarkierte Zahl und markiere ihre größeren Vielfachen als zusammengesetzt. Gib die Ergebnisse in aufsteigender Reihenfolge aus.

Implementiere sieve_primes(limit).

Eingabe

limit: Die größte Zahl, die enthalten sein darf.

Ausgabe

Gib die Primzahlen in aufsteigender Reihenfolge zurück oder eine leere Liste, falls keine existieren.

Einschränkungen

0 ≤ limit ≤ 100.000. Die obere Grenze ist inklusive. Die Ausgabetests prüfen die Ergebnisse, nicht den genauen verwendeten Algorithmus.

Beispiele

Beispiel 1
Eingabe:
limit = 12

Erwartete Ausgabe:
expected = [2, 3, 5, 7, 11]
Eingabe:
long long limit = 12;

Erwartete Ausgabe:
std::vector<long long> expected = {2, 3, 5, 7, 11};
Eingabe:
long limit = 12;

Erwartete Ausgabe:
long[] expected = new long[] {2, 3, 5, 7, 11};

Erläuterung

Markiere die Vielfachen von 2 und 3 als zusammengesetzt. Die verbleibenden Werte bis 12 sind 2, 3, 5, 7 und 11.

Beispiel 2
Eingabe:
limit = 1

Erwartete Ausgabe:
expected = []
Eingabe:
long long limit = 1;

Erwartete Ausgabe:
std::vector<long long> expected = {};
Eingabe:
long limit = 1;

Erwartete Ausgabe:
long[] expected = new long[] {};

Erläuterung

Primzahlen beginnen bei 2, darüber hinaus liegt dieser Grenzwert.

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Markiere Vielfache ab jedem noch unmarkierten Primkandidaten und arbeite bis zum Limit weiter.

Hinweis 2

Nur Zahlen, die am Ende unmarkiert bleiben, sind prim.

Hinweis 3

Hör auf, Vielfache zu markieren, sobald das Quadrat des Kandidaten das Limit überschreitet.

Erwartete Komplexität

Zeit O(n log log n), zusätzlicher Speicher O(n)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.