Voll­kom­me­ne Zahlen

bool Stopp = true;

void setup()
{
  // Seriellen Monitor starten
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  Serial.println("Die ersten 4 vollkommenen Zahlen:");
  Serial.println("---------------------------------");
}

bool Primzahl(float Zahl)
{
  // zum Testen nach int umwandeln
  int PruefZahl = round(Zahl);

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

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

void loop()
{
  while (Stopp)
  {
    /*
      eine vollkommene Zahl ist die Summe ihrer Teiler
      (ausgenommen 1 und die Zahl selbst)
      die ersten 4 vollkommenen Zahlen
    */
    for (int i = 2; i < 8; i++)
    {
      /*
        Formel zur Berechnung:
        2^(i-1) * (2^i - 1)
        wobei der Wert des Terms (2^i) - 1 eine Primzahl sein muss
      */

      // Wert des Terms pow(2, i) - 1 auf Primzahl untersuchen
      bool Suche = Primzahl(pow(2, i) - 1);

      // der Wert des Terms ist eine Primzahl (Suche = true)
      // -> vollkommene Zahl gefunden
      if (Suche)
      {
        // Ergebnis ist eine Zahl vom Typ float -> muss gerundet werden
        Serial.println(round(pow(2, (i - 1)) * (pow(2, i) - 1)));
      }
    }
    Serial.println("------------------------------------");
    Stopp = false;
  }
}

Letzte Aktualisierung: 25. Jul 2023 @ 21:14