Prozentanzeige | Gaußsche Summenregel

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.
Antworten
DrragoGangsta
User
Beiträge: 6
Registriert: Mittwoch 11. Februar 2015, 15:49

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.

Code: Alles auswählen

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!")
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
DrragoGangsta
User
Beiträge: 6
Registriert: Mittwoch 11. Februar 2015, 15:49

@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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Code: Alles auswählen

#...
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.
a fool with a tool is still a fool, www.magben.de, YouTube
DrragoGangsta
User
Beiträge: 6
Registriert: Mittwoch 11. Februar 2015, 15:49

MagBen hat geschrieben:

Code: Alles auswählen

#...
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.
Vielen Lieben Dank
Antworten