Brüche kürzen in Python?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Zum Kürzen würde ich zunächst mit dem euklidischen Algorithmus den ggT (größten gemeinsamen Teiler) von Zähler und Nenner berechnen, und dann den Bruch mit dem ggT kürzen, indem Zähler und Nenner jeweils durch den ggT dividiert werden.

https://de.wikipedia.org/wiki/Euklidischer_Algorithmus

Also beispielsweise so:

def ggT(a, b):
    while b:
        a, b = b, a % b
    return(a)

def kürze_bruch(zähler, nenner):
    g = ggT(zähler, nenner)
    return(zähler//g, nenner//g)

Dann erhältst du beispielsweise mit kürze_bruch(132, 156) das Wertepaar (11, 13) für den entsprechenden gekürzten Bruch.

============

Wenn es dich stören sollte, dass da eine (bzw. zwei) Funktion(en) definiert werden, kannst du das natürlich auch ohne Funktion direkt im Code einfügen. Allerdings ist das eben eine Stelle, wo sich Funktionen anbieten, da du an verschiedenen Stellen das gleiche tun möchtest, und da es so übersichtlicher ist. Aber es geht eben auch ohne, wenn man denn möchte. Beispiel:

zähler = 132
nenner = 156
print(f"Vor dem Kürzen: {zähler}/{nenner}")

# Berechne den ggT von zähler und nenner:
a, b = zähler, nenner
while b:
    a, b = b, a % b
# Nun ist a = ggT(zähler, nenner).
# Kürze nun den Bruch zähler/nenner entsprechend:
zähler = zähler//a
nenner = nenner//a

print(f"Nach dem Kürzen: {zähler}/{nenner}")

============

Oder, falls du den euklidischen Algorithmus zum bestimmen des ggT nicht kennen solltest, kann man den ggT auch ganz stumpf ermitteln, indem man von |nenner| ausgehend absteigend die Zahlen von 1 bis |nenner| durchgeht und überprüft, ob die Zahl jeweils Teiler von zähler und Teiler von nenner ist. Wenn das der Fall ist, hat man den ggT gefunden und kann mit diesem ggT kürzen.

zähler = 132
nenner = 156
print(f"Vor dem Kürzen: {zähler}/{nenner}")

for g in range(abs(nenner), 0, -1):
    if nenner % g == 0 and zähler % g == 0:
        zähler = zähler//g
        nenner = nenner//g
        break

print(f"Nach dem Kürzen: {zähler}/{nenner}")

Bzw. würde ich evtl. auch dafür sorgen, dass der Nenner positiv wird, falls er negativ ist. Das sieht im Ergebnis nicht nur schöner aus, sondern wenn man beispielsweise zähler = -132 und nenner = -156 hätte, wäre es doch evtl. auch wünschenswert am Ende 11/13 statt (-11)/(-13) zu erhalten. Daher würde ich die letzte von mir vorgeschlagene Lösung noch entsprechend etwas abwandeln...

zähler = 132
nenner = 156
print(f"Vor dem Kürzen: {zähler}/{nenner}")

if nenner < 0:
    zähler = -zähler
    nenner = -nenner
for g in range(nenner, 0, -1):
    if nenner % g == 0 and zähler % g == 0:
        zähler = zähler//g
        nenner = nenner//g
        break

print(f"Nach dem Kürzen: {zähler}/{nenner}")

Wenn du einen Bruch kürzen möchtest dann kannst du die Funktion round(number, digits) verwenden. Wobei die erste übergebene Zahl die zu rundende Zahl und die Zweite, auf wie vielen Nachkommastellen man runden möchte.

Wenn du eine eigene Funktion schreiben/haben möchtest oder etwas ganz anderes, dann schreibe einfach unter dieser Antwort.

Woher ich das weiß:eigene Erfahrung