Vollkommene/Perfekte Zahl in einem Bereich herausfinden?
Hallo,
ich muss in Python ein Programm erstellen, welches überprüft, ob in einem Bereich des Nutzers eine Vollkommene Zahl ist. Ich habe einen Ansatz, aber er ist falsch und ich habe keine Idee mehr.
Der Link zu dem Problem und Code ist hier: https://pastebin.com/4SXUk8fG
MfG Leonardo
Vollkommene Zahl = ganze Zahl?
Nein.
3 Antworten
Bei Wikipedia finde ich folgende mathematische Definition, die wesentlich simpler zum Umsetzen ist als dein Ansatz:
(1) 2^(k-1) * (2^k - 1)
allerdings darfst du für k nicht jede beliebige Zahl einsetzen, sondern die sog. Mersenne-Primzahlen. Das sind Zahlen, für die gilt:
(2) Mk = 2^k - 1
Vorgehen könnte sein:
Du lässt Formel (2) k von 0 ... 100.000.000 laufen und prüfst jeweils, ob Mk eine Primzahl ist. Falls ja, kommt k in eine Liste. Danach lässt du Formel (1) mit allen k in der Liste laufen und erhältst dabei die geforderten Vollkommenen Zahlen.
Das wundert mich nicht. Ich glaube mein 100.000.000 war etwas zu hoch gegriffen. Mit k = 89 erhältst du die größte Mersenne-Primzahl unter 100 und wenn du die einsetzt, kommt die Vollkommene Zahl 191.561.942.608.236.107.294.793.378.084.303.638.130.997.321.548.169.216 raus.
Ich habe einfach nach den Primzahlen geguckt. Ich musste nur bis 12xx gehen, weil ab da an ein Overflow kam. Trotzdem danke, das hat mir sehr geholfen.
Ich bin mir trotzdem nicht sicher, ob ihr die Aufgabe nicht eher per Logik lösen müsstet, also ähnlich wie du es vorgeschlagen hattest. So eine algebraische Umsetzung ist mathematisch anspruchsvoller, aber programmiertechnisch super easy.
Da vollkommene Zahlen sehr selten sind, ist die einfachste Lösung mit einer Liste aller bekannten v.Z. zu vergleichen:
- 6
- 28
- 496
- 8.128
- 33.550.336
- 8.589.869.056
- 137.438.691.328
- 2.305.843.008.139.952.128
Damit verlässt du dann schon den Zahlenbereich von long in Java. Insgesamt sind 51 vollkommene Zahlen bekannt
Vermutlich ist das aber nicht die Lösung, die der Aufgabensteller gerne gehabt hätte ;-) Und nach 7 Monaten hat sich diese Antwort vermutlich sowieso erledigt.
Es wäre hilfreich, inwiefern es "falsch" ist. Kommt ein Fehler? Funktionieren nur die ersten Werte? Ist es ein mathematisches Problem oder kommst du bei Python nicht weiter?
Es ist ein mathematisches Problem und bei mir kommen nur falsche Lösungen raus.
Also der Vorschlag ist gut, aber leider dauert es bis k = 100 schon Minuten...