Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Hey Leute,
Ich habe folgenden Code mit dem man alle Befreundeten Zahlen bis zu einer bestimmten Obergrenze anzeigen lassen kann. Am Ende wird alles in einer Liste ausgegeben. Das Problem bei höheren Zahlen ist, dass es lange dauern kann, und um den Fortschritt zu sehen möchte ich eine Prozentanzeige einbauen, jedoch krieg ich die mithilfe der Gaußschen Summenregel irgendwie nicht zustande. Ich hoffe ihr könnt helfen.
def divs(counter, i):
divisor = []
while counter < (i / 2) + 1:
if i % counter == 0:
divisor.append(counter)
counter += 1
return divisor
maxNumber = int(input("Bitte geben sie einen Endwert an: "))
printed = []
toPrint = []
for i in range(2, maxNumber + 1):
#ich schätze hier muss diese Prozentanzeige rein
c = 0
counter = 1
divisor = divs(counter, i)
if sum(divisor) == i:
i = str(i) + " ist vollkommen"
toPrint.append(i)
else:
s = sum(divisor)
counter = 1
divisor = divs(counter, s)
if sum(divisor) == i and i not in printed and s not in printed:
i = str(i) + " und " + str(s) + " sind befreundet"
toPrint.append(i)
printed.append(s)
printed.append(i)
print('\n'.join(map(str, toPrint)))
print("fertig!")
@DrragoGangsta: es dürfte wohl deutlich schneller sein, alle Primfaktoren einer Zahl zu bestimmen und daraus dann die Anzahl der Teiler.
Statt mit einer while-Schleife selbst einen counter zu zählen gibt es in Python for-Schleifen mit range. Wenn der Parameter counter immer 1 ist, warum ist das überhaupt ein Parameter? Auch wenn es sich um eine ganze Zahl handelt, ist i ein schlechter Name für einen Parameter. printed ist besser ein Set als eine Liste. toPrint enthält nur strings, daher ist das map in der letzten Zeile unnötig. Statt Strings mit + und str zusammenzustückeln, solltest Du .format benutzen. c wird nirgends verwendet. Wenn Du sowieso nur die Summe brauchst, könnte divs auch gleich die Summe zurückgeben.
@Sirius3 Danke, aber dass war teil der Aufgabenstellung das so zu machen wie ich es habe. Ich müsste nur einfach diese Summenformel implementieren, sodass sie mir in der for-Schleife die Prozente ausgibt
#...
progress = -1
for i in range(2, maxNumber + 1):
current_progress = int(100. * (float(i)/maxNumber)**2 + .5)
if current_progress > progress:
progress = current_progress
print("%i %%" % progress)
c = 0
#...
Das **2 soll erreichen, dass trotz des nichtlinearen Anwachsens des Rechenaufwandes die Fortschrittsanzeige trotzdem einigermaßen gleichmäßig verläuft.
#...
progress = -1
for i in range(2, maxNumber + 1):
current_progress = int(100. * (float(i)/maxNumber)**2 + .5)
if current_progress > progress:
progress = current_progress
print("%i %%" % progress)
c = 0
#...
Das **2 soll erreichen, dass trotz des nichtlinearen Anwachsens des Rechenaufwandes die Fortschrittsanzeige trotzdem einigermaßen gleichmäßig verläuft.