Prim­zah­len ermitteln

Lese­zeit: 4 Minu­ten

Lösung
Seite als PDF

Das Pro­gramm soll die Prim­zah­len von 2 bis zur ein­ge­ge­be­nen Zahl im Seri­el­len Moni­tor anzei­gen. Außer­dem wird eine Ober­gren­ze für die ein­ge­ge­be­ne Zahl fest­ge­legt. Die Varia­ble int ist auf 32767 begrenzt und die Unter­su­chung grö­ße­rer Zah­len benö­tigt sehr viel Rechenzeit.

So sieht es aus:

Für die­se Anlei­tung brauchst du nur den Arduino.

Defi­nie­re die Variablen:

int Zahl;
int EingabeMax = 1000;

Der set­up-Teil star­tet den Seri­el­len Moni­tor und zeigt die Auf­for­de­rung an, eine Zahl einzugeben.

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}
  
  Serial.println("Zahl eingeben:");
  Serial.println("Maximum ist: " + String(EingabeMax) + "!");
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  String Eingabe;

  while (Serial.available() > 0)
  {
    // solange lesen, bis return \n eingegeben wurde
    Eingabe = Serial.readStringUntil('\n');

    // das letzte Zeichen ist return → soll entfernt werden
    Eingabe = Eingabe.substring(0, Eingabe.length() - 1);

    // eingegebene Eingabe zu int umwandeln
    Zahl = Eingabe.toInt();

    // nur ausführen wenn Zahl < 1000
    // -> ansonsten ist die Rechenzeit zu lang
    if (Zahl <= EingabeMax)
    {
      int ZaehlerZeile = 0;

      Serial.println("----------------------------------------------");
      Serial.println("Primzahlen bis " + String(Eingabe)) ;
      for (int i = 2 ; i < Zahl; i++)
      {
        // Primzahl suchen -> Funktion aufrufen
        bool Suche = Primzahl(i);

        // Primzahl gefunden -> Suche = true
        if (Suche)
        {
          ZaehlerZeile++;

          // 10 Zahlen pro Zeile
          if (ZaehlerZeile % 10 == 0) Serial.println(String(i) + "," ) ;
          else Serial.print(String(i) + "," + '\t') ;
        }
      }
      Serial.println("\n---------------------------------------------");
      Serial.println(String(ZaehlerZeile) + " Primzahlen gefunden!");
    }

    // \u00df -> ß
    else Serial.println("Die Eingabe ist zu gro\u00df!");
  }
}

Der Funk­ti­on Prim­zahl wird die zu unter­su­chen­de Zahl über­ge­ben. Weil Tei­ler, die grö­ßer als die Hälf­te der Zahl sind, nicht mög­lich sind, wird auch nur bis zur Hälf­te geprüft.

Die Prim­zah­len wer­den mit einer ➨bool-Funk­ti­on bestimmt.

Die Teil­bar­keit wird mit ➨modu­lo ermittelt.

bool Primzahl(int Zahl)
{
  // nur bis zur Hälfte der Eingabe prüfen
  for (int i = 2 ; i <= Zahl / 2; i++)
  {
    // Teilbarkeit mit modulo testen
    // wenn kein Rest → Eingabe ist teilbar → false zurückgeben
    if (Zahl % i == 0) return false;
  }

  // keine Teiler gefunden → Primzahl = true zurückgeben
  return true;
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 10. Okt 2023 @ 9:37