Herausfiltern des ggT zweier Elemente

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
BlowKissFireGun
User
Beiträge: 5
Registriert: Mittwoch 9. Juni 2021, 11:50

Hallo liebe Forengemeinde,

ich bin's wieder die Nervensäge. Bin jetzt am Schreiben meiner ersten Programm und bin jetzt kurz vorm Abschluss beim Programm, das den größten gemeinsamen Teiler ermitteln soll aus zwei gegebenen Zahlenobjekten.
Meine Schwierigkeiten liegt im Umwandeln der Menge in eine Liste. Kann mir vielleicht bitte einmal jemand erklären, wo genau mein Fehler ist?
Ich gebe den folgenden Quelltext ein:

Code: Alles auswählen

#Herausfinden des ggT
a = int(input("Geben Sie eine Zahl a ein: "))
b = int(input("Geben Sie eine zweite Zahl b ein: "))
if a>=b and a%b == 0:
    print("Der größte gemeinsame Teiler ist: ", b)
elif b>a and b%a == 0:
    print("Der größte gemeinsame Teiler ist: ", a)
else:
    a_Teiler = []
    b_Teiler = []
    for i in range(1,a):
        if a%i == 0:
            a_Teiler.append(i)
    for i in range(1,b):
        if b%i == 0:
            b_Teiler.append(i)
            
a_Teiler = set(a_Teiler)

b_Teiler = set(b_Teiler)

def gK(a,b):
    return a_Teiler.intersection(b_Teiler)

def ggT(gK):
    gK = list(gK)
    return max(gK)

print(" gemeinsame Teiler der Zahl sind: ", gK(a,b))
print(" Der größte gemeinsame Teiler ist: ",ggT(gK))
    
In der Shell bekomme ich dann folgenden Text angezigt:

Code: Alles auswählen

Geben Sie eine Zahl a ein: 6
Geben Sie eine zweite Zahl b ein: 21
 gemeinsame Teiler der Zahl sind:  {1, 3}
Traceback (most recent call last):
  File "C:/Users/juss/AppData/Local/Programs/Python/Python39/ggT.py", line 30, in <module>
    print(" Der größte gemeinsame Teiler ist: ",ggT(gK))
  File "C:/Users/juss/AppData/Local/Programs/Python/Python39/ggT.py", line 26, in ggT
    gK = list(gK)
TypeError: 'function' object is not iterable
In der Funktion, die die größte Komponente der Schnittmenge der beiden Teilmengen bestimmen soll, läuft etwas schief. Nur weiß ich leider als kompletter Neuanfänger nicht was. :roll: :?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Nur eine Kleinigkeit:

Du versuchst aus der Funktion selbst eine Liste zu machen. Das funktioniert nicht.
So währe es richtig:

Code: Alles auswählen

gK = list(gK(a,b))
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich würde das Ganze auch noch etwas restrukturieren:
In der Funktion gK werden die Eingangsparameter a, b gar nicht verwendet.
Die Funktionen anders aufteilen in:
- Benutzereingabe der Werte
- Berechnung der Teiler einer Zahl
- Berechnung des ggT aus den Teilern
- Ausgabe der Ergebnisse

Zur Zeit haben die Funktionen teilweise gemischte Aufgaben.
BlowKissFireGun
User
Beiträge: 5
Registriert: Mittwoch 9. Juni 2021, 11:50

Wow, das funktioniert. Bin sprachlos. Und umstrukturieren werde ich es noch. Danke dir :)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles, was eine Funktion braucht, sollte sie auch über ihre Argumente bekommen, in `gK` kommen `a_Teiler` und `b_Teiler` aus dem nichts. Benutze keine kryptischen Abkürzungen, ich habe keine Ahnung, was gK bedeuten soll?
Die Funktion ggT hat auch ein komisches Argument. Größter gemeinsamer Teile bekommt schon eine Liste an Teilern? Dann müßte die Zahl gT heißten, also größter_teiler.
Sowohl Funktionen als auch Variablennamen schreibt man komplett klein.
Man vermeidet eigentlich, doppelten Code zu haben, das Berechnen von den Teilern von a ist aber identisch zur Berechnung der Teiler von b.
Es gibt deutlich effizientere Algorithmen zum Berechnen aller Teiler und deutlich effizientere Algorithmen zum berechnen des größten gemeinsamen Teilers.
Antworten