Prim­zah­len ermit­teln

Lese­zeit: 4 Minu­ten
Navi­ga­ti­on

Das Pro­gramm soll die Prim­zah­len von 2 bis zu dem durch die Ein­ga­be der Zahl begrenz­ten Maxi­mum 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 32768 begrenzt und die Unter­su­chung grö­ße­rer Zah­len benö­tigt sehr viel Rechen­zeit.

So soll es aus­se­hen:

Für die­se Auf­ga­be brauchst du nur den Ardui­no.

Defi­nie­re die Varia­blen:

int Zahl;
int EingabeMax = 1000;

Der setup-Teil star­tet den Seri­el­len Moni­tor und zeigt die Auf­for­de­rung an, eine Zahl ein­zu­ge­ben.

void setup()
{
  Serial.begin(9600);
  Serial.println("Zahl eingeben:");
}

Der loop-Teil. Beach­te die Kom­men­ta­re.

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-Funktion bestimmt.

Die Teil­bar­keit wird mit ➨modu­lo ermit­telt.

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;
}


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 16. Okt 2020 @ 18:30