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 Varia­ble Ein­ga­be­Max, die Zah­len sol­len nicht grö­ßer als 1000 sein:

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);
  delay(1000);
  
  Serial.println("Zahl eingeben:");
  Serial.println("Maximum ist: " + String(EingabeMax) + "!");
}

Der loop-Teil. Beach­te die Kommentare.

void loop() 
{
  while (Serial.available() > 0) 
  {
    int Zahl = Serial.parseInt();

    // Enter/Senden gedrückt
    if (Serial.read() == '\n') 
    {
      // 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(Zahl));
        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!");
      }
    
      else Serial.println("Die Eingabe ist >1000");
    }
  }
}

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 Anleitungen:


Letzte Aktualisierung: Nov. 5, 2024 @ 10:18