Voll­kom­me­ne Zahlen

Lese­zeit: 4 Minu­ten

Lösung
Seite als PDF

Eine natür­li­che Zahl n wird voll­kom­me­ne Zahl (auch per­fek­te Zahl) genannt, wenn sie gleich der Sum­me aller ihrer Tei­ler außer sich selbst ist.
Die ers­te voll­kom­me­ne Zahl ist 28:
28 = 1 + 2 + 4 + 7 + 14

Dann folgt:
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248

Voll­kom­me­nen Zah­len wer­den mit dem Term ...

2k-1 (2k - 1)

... berech­net. Der Term ergibt immer dann eine voll­kom­me­ne Zahl, wenn der Wert von (2k - 1) eine Prim­zahl ergibt. Im Seri­el­len Moni­tor sol­len die ers­ten vier voll­kom­me­nen Zah­len ange­zeigt werden.

So sieht es aus:

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

// sorgt dafür, dass das Programm nur einmal ausgeführt wird
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()
{
  // solange Stopp = true wird loop ausgeführt
  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("------------------------------------");

    // Programm wird angehalten
    Stopp = false;
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 9. Okt 2023 @ 23:09