Perfektes Zahlenprogramm in Python: Wie überprüfe ich, ob eine Zahl perfekt ist oder nicht?

Veröffentlicht: 2021-01-29

Einführung

Eine Zahl wird als vollkommene Zahl bezeichnet, wenn die Summe ihrer echten Teiler (ohne die Zahl selbst) gleich der Zahl ist.

Um eine bessere Vorstellung zu bekommen, betrachten wir ein Beispiel: Echte Teiler von 6 sind 1, 2, 3. Jetzt ist die Summe dieser Teiler gleich 6 (1 + 2 + 3 = 6), also wird 6 als perfekte Zahl bezeichnet . Wenn wir dagegen eine andere Zahl wie 12 betrachten, sind die richtigen Teiler von 12 1, 2, 3, 4, 6. Nun ist die Summe dieser Teiler nicht gleich 12, also ist 12 keine perfekte Zahl.

Das Programmieren in Python ist im Vergleich zu anderen Sprachen aufgrund der einfacheren Syntax und der guten Lesbarkeit relativ einfacher und macht mehr Spaß. Nun, da wir mit dem Konzept der perfekten Zahl klar sind, schreiben wir ein Python-Programm, um zu prüfen, ob eine Zahl eine perfekte Zahl ist oder nicht. Lassen Sie uns einen Python-Code erstellen, um zu überprüfen, ob die gegebene Benutzereingabe eine perfekte Zahl ist oder nicht, und den Spaß am Programmieren mit Python erkunden. Werfen Sie einen Blick auf unsere Data-Science-Programme, wenn Sie daran interessiert sind, Fachwissen zu erwerben.

Lesen Sie: Python-Pattern-Programme

Inhaltsverzeichnis

Python-Programm

Eine grundlegende Lösung, um eine perfekte Zahl zu finden, besteht darin, eine Schleife über 2 zu Zahl-1 zu erstellen, die Summe ihrer richtigen Teiler beizubehalten und zu prüfen, ob die Summe gleich der Zahl ist.

n=int(input("Geben Sie die Nummer ein"))
Summe=1
für i im Bereich(2,n):
if(n%i==0):
summe=summe+i
if(summe==n):
print(n, „ist eine vollkommene Zahl“)
anders:
print(n, „ist keine perfekte Zahl“)

Lassen Sie uns den Code durchgehen.

Wir initialisieren zunächst n mit der Benutzereingabe und wandeln es in eine Ganzzahl um, da die Benutzereingabe standardmäßig als Zeichenfolge in Python gelesen wird. Wir müssen prüfen, ob n eine vollkommene Zahl ist oder nicht. Beachten Sie, dass wir die Summe mit 1 initialisieren, da 1 ein echter Teiler für alle ganzen Zahlen (außer Null) ist, sodass wir eine Iteration in der Schleife ausschließen und direkt bei 2 beginnen können.

Wir schleifen über 2 zu Zahl-1 und addieren die ganzen Zahlen zur Summe, wenn es sich um einen richtigen Teiler handelt. Und schließlich, wenn wir aus der Schleife herauskommen, prüfen wir, ob die erhaltene Summe gleich der Zahl ist oder nicht. Kinderspiel oder?

Kleine optimierte Version

Nach einem Probelauf über das obige Programm haben wir vielleicht eine Frage, können wir es optimieren? Nun, aber wir können die Anzahl der Iterationen auf Zahl/2 reduzieren, ohne den Algorithmus zu ändern. Weil wir auf die Idee gekommen sind, dass eine Zahl keinen echten Teiler größer als Zahl/2 haben kann.

n=int(input("Geben Sie die Nummer ein"))
Summe=1
für i im Bereich (2,n//2+1):
if(n%i==0):
summe=summe+i
if(summe==n):
print(n, „ist eine vollkommene Zahl“)
anders:
print(n, „ist keine perfekte Zahl“)

Das obige Snippet ist dem vorherigen fast ähnlich, mit dem einzigen Unterschied, dass es bis Nummer/2 geloopt wird. Beachten Sie, dass wir eine Integer-Division durchführen, um eine Konvertierung in einen Float-Typ zu vermeiden, und wir bis n//2+1 wiederholen, da die letzte Ganzzahl im Bereich in der Python-Schleife nicht berücksichtigt wird.

Einschränkungen

Wenn wir aufgefordert werden, perfekte Zahlen in einem bestimmten Bereich zu finden, würde unsere Lösung Zeit proportional zu Zahl ^ 2 verbrauchen, dh O(n²) Zeitkomplexität. Weil wir jede Zahl im angegebenen Bereich durchlaufen und dann für jede Zahl nach den richtigen Teilern suchen müssen. Und nur wenige Zahlen erfüllen die perfekte Zahlbedingung. Beispielsweise beträgt die Anzahl der perfekten Zahlen im Bereich von 0 bis 1000 nur 3 (6, 28, 496).

Dafür gibt es eine optimierte Lösung, bei der wir nicht alle Elemente durchlaufen müssen, um die richtigen Teiler zu finden. Euklids Formel besagt, dass 2 n − 1 (2 n − 1) eine gerade perfekte Zahl ist, bei der sowohl n als auch (2 n − 1) ist Primzahlen. Zum Beispiel erfüllt 6 die obige Gleichung mit n als 2 und beide 2, 2 2 − 1 (2 2 − 1 = 3) sind Primzahlen. Aber wir können nicht antworten, wenn wir gefragt wurden, ob es irgendwelche ungeraden vollkommenen Zahlen gibt.

Außerdem wissen wir, dass jede Sprache eine Begrenzung des Bereichs von Ganzzahlen hat, die sie speichern kann. Mit dieser Einschränkung haben wir möglicherweise keine Möglichkeit, die größte vollkommene Zahl zu finden.

All diese Einschränkungen treten auf, wenn unsere Eingabezahl groß ist, aber wenn unsere Eingabezahl klein ist, würde unsere anfängliche Lösung in kürzerer Zeit funktionieren.

Lesen Sie auch: Python-Framework für die Webentwicklung

Fazit

Wir kennen die Definition und haben das Konzept hinter der perfekten Zahl verstanden. Gehen Sie durch eine grundlegende Lösung, um eine Zahl zu finden, die eine perfekte Zahl ist oder nicht. Und nachdem wir uns die ursprüngliche Lösung angesehen haben, haben wir sie ein wenig optimiert, indem wir die Anzahl der Iterationen reduziert haben. Wir sind durch die Grenzen unseres Algorithmus gegangen und haben Euklids Formel zum Finden der geraden vollkommenen Zahl besprochen.

Nun, da Sie das Python-Programm kennen, um zu überprüfen, ob eine Zahl eine perfekte Zahl ist oder nicht. Versuchen Sie, den Code selbst zu schreiben, und versuchen Sie, ihn zu optimieren, wenn Sie überlappende Iterationen finden. Versuchen Sie auch, den Code zu erstellen, um perfekte Zahlen in dem angegebenen Zahlenbereich zu finden.

Wenn Sie mehr über Python und Data Science erfahren möchten, besuchen Sie das Executive PG Program in Data Science von IIIT-B & upGrad, das für Berufstätige entwickelt wurde und mehr als 10 Fallstudien und Projekte, praktische Workshops und Mentoring mit Branchenexperten bietet , 1-zu-1 mit Mentoren aus der Branche, über 400 Stunden Lern- und Jobunterstützung bei Top-Unternehmen.

Erklären Sie die Komplexität des Programms „Perfekte Zahl“ in Python.

Eine Zahl heißt vollkommene Zahl, wenn sie gleich der Summe ihrer Teiler ist. Um zu überprüfen, ob eine Zahl perfekt ist oder nicht, haben wir zwei Ansätze. Der erste Ansatz ist ein naiver Ansatz, bei dem die Zeitkomplexität O(n2) ist, da wir „j“ mal für jedes „i“ iterieren und auf seine Teiler prüfen.
Der zweite Ansatz ist die optimierte Lösung, bei der die Zeitkomplexität O(√n) ist. Hier müssen wir nicht über jede Zahl iterieren. Wir können es direkt mit der Formel von Euklid schließen, die lautet:
2n−1(2n − 1), wobei n und 2n Primzahlen sind.
Diese Formel funktioniert jedoch nicht für die ungeraden vollkommenen Zahlen und daher müssen wir einen anderen Ansatz für sie finden.

Was sind die Grenzen der Ansätze des Perfect Number Programms?

Beide Ansätze sind gut, aber nur bis zu einem gewissen Grad. Keiner von beiden kann aufgrund einiger technischer Besonderheiten als der perfekte Ansatz angesehen werden. Die Einschränkungen dieser Ansätze sind wie folgt:

1. Der erste und naive Ansatz ist schlechter, weil er viel Zeit und Speicher verbraucht und eine Zeitkomplexität von O(n2) hat. Dies liegt daran, dass wir eine verschachtelte Schleife verwenden und die innere Schleife n-mal für jedes Element der äußeren Schleife durchlaufen. Dieser Ansatz ist naiv und ergibt TLE für größere Werte von n und wird daher nicht empfohlen.
2. Dann haben wir einen optimierten Ansatz, der das Problem in O(√n) löst. Dies ist ein guter Ansatz, es sei denn, die ungeraden vollkommenen Zahlen kommen ins Spiel. Wir können mit diesem Ansatz nicht nach ungeraden vollkommenen Zahlen suchen, da er auf „Euklids Formel für gerade vollkommene Zahlen“ basiert, die nur für gerade vollkommene Zahlen funktioniert.

Ist Python für kompetitive Programmierung geeignet?

Python hat sich aus C/C++ und sogar Java entwickelt und gilt als die am besten geeignete Sprache für Forschungs- und Entwicklungszwecke. Aber wenn es um kompetitives Programmieren geht, meidet die Mehrheit der Programmierer-Community Python. Der Grund dafür ist, dass Python die langsamste unter diesen drei Sprachen ist.