# -*- coding: cp1252 -*-
# (c) Mattes
class Bruch:
def __init__(self, zaehler,nenner):
self.zaehler = zaehler
self.nenner = nenner
def gibZaehler(self):
return self.zaehler
def gibNenner(self):
return self.nenner
def toString(self):
return str(self.zaehler) + "/" + str(self.nenner)
def clone(self):
return Bruch(self.zaehler, self.nenner)
def add(self, bruch2):
zaehler = self.zaehler * bruch2.nenner + bruch2.zaehler*self.nenner
nenner = self.nenner * bruch2.nenner
ergebnis = Bruch(zaehler, nenner)
return ergebnis
def sub(self, bruch2):
zaehler = self.zaehler * bruch2.nenner - bruch2.zaehler*self.nenner
nenner = self.nenner * bruch2.nenner
ergebnis = Bruch(zaehler, nenner)
return ergebnis
def mul(self, bruch2):
zaehler = self.zaehler * bruch2.zaehler
nenner = self.nenner * bruch2.nenner
ergebnis = Bruch(zaehler, nenner)
return ergebnis
def div(self, bruch2):
zaehler = self.zaehler * bruch2.nenner
nenner = self.nenner * bruch2.zaehler
ergebnis = Bruch(zaehler, nenner)
return ergebnis
def erweitern(self, faktor):
self.zaehler = self.zaehler * faktor
self.nenner = self.nenner * faktor
def ggT(self, a, b):
# ggT für positive Zahlen ermitteln:
if a<0:
a=-a
if b<0:
b=-b
# teiler auf kleinere der beiden Zahlen setzen
if a<b:
teiler = a
else:
teiler = b
# teiler herunterzählern, bis Teiler von beiden
while (a%teiler!=0 or b%teiler!=0):
teiler = teiler - 1
return teiler
def kuerzen(self):
ggT = self.ggT(self.zaehler,self.nenner)
self.zaehler = self.zaehler / ggT
self.nenner = self.nenner / ggT
def kehrWert(self):
return Bruch(self.nenner, self.zaehler)
class EffizienterBruch(Bruch):
def __init__(self, zaehler, nenner):
Bruch.__init__(self, zaehler, nenner)
self.kuerzen()
## def ggT(self, a, b):
## ergebnis = a
## if b==0:
## return a
## elif a>b:
## return self.ggT(b,a-b)
## else:
## return self.ggT(a,b-a)
def ggT(self, a, b):
if a<0:
a=-a
if b<0:
b=-b
if b==0:
return a
else:
return self.ggT(b,a%b)
def kgV(self,a,b):
return a*b/self.ggT(a,b)
def add(self, bruch2):
hauptNenner = self.kgV(self.nenner,bruch2.nenner)
erweiterungsFaktor1 = hauptNenner//self.nenner
erweiterungsFaktor2 = hauptNenner//bruch2.nenner
zaehler = self.zaehler * erweiterungsFaktor1 + bruch2.zaehler * erweiterungsFaktor2
ergebnis = EffizienterBruch(zaehler, hauptNenner)
ergebnis.kuerzen()
return ergebnis
def sub(self, bruch2):
hauptNenner = self.kgV(self.nenner,bruch2.nenner)
erweiterungsFaktor1 = hauptNenner//self.nenner
erweiterungsFaktor2 = hauptNenner//bruch2.nenner
zaehler = self.zaehler * erweiterungsFaktor1 - bruch2.zaehler * erweiterungsFaktor2
ergebnis = EffizienterBruch(zaehler, hauptNenner)
self.kuerzen()
return ergebnis
def mul(self, bruch2):
zaehler = self.zaehler * bruch2.zaehler
nenner = self.nenner * bruch2.nenner
ergebnis = EffizienterBruch(zaehler, nenner)
ergebnis.kuerzen()
return ergebnis
def div(self, bruch2):
zaehler = self.zaehler * bruch2.nenner
nenner = self.nenner * bruch2.zaehler
ergebnis = EffizienterBruch(zaehler, nenner)
ergebnis.kuerzen()
return ergebnis
class KettenBruch(EffizienterBruch):
def __init__(self, zaehler, nenner):
EffizienterBruch.__init__(self,zaehler, nenner)
def __init__(self, faktorenListe):
a = self.ketteAufloesenIterativ(faktorenListe)
self.zaehler = a.zaehler
self.nenner = a.nenner
self.kuerzen()
def ketteAufloesenIterativ(self, faktorenListe):
length = len(faktorenListe)
b = EffizienterBruch(faktorenListe[length-1],1)
print("Faktor "+str(length-1)+" ist "+ str(faktorenListe[length-1])+", b = "+b.toString())
for i in range(length-1):
b = b.kehrWert()
b = b.add(EffizienterBruch(faktorenListe[length-(i+2)],1))
#print("Faktor "+str(length-(i+2))+" ist "+ str(faktorenListe[length-(i+2)])+", b = "+b.toString())
return b
def ketteAufloesenRekursiv(self, faktorenListe):
if len(faktorenListe)==1:
return EffizienterBruch(faktorenListe[0],1)
else:
b = EffizienterBruch(faktorenListe[0],1)
c = self.ketteAufloesenRekursiv(faktorenListe[1:len(faktorenListe)])
c = c.kehrWert()
return b.add(c)
def ketteAufloesen(self, faktorenListe):
if len(faktorenListe)==1:
return EffizienterBruch(faktorenListe[0],1)
else:
b = EffizienterBruch(faktorenListe[0],1)
c = self.ketteAufloesenRekursiv(faktorenListe[1:len(faktorenListe)])
c = c.kehrWert()
return b.add(c)
def eggT(self, a, b, liste):
if b==0:
return a
else:
liste.append(a//b)
return self.eggT(b,a%b,liste)
def toString(self):
liste = self.toFaktorenListe()
st = "["
for i in liste:
st = st + str(i) + ", "
if len(st)>1:
st = st[0:len(st)-2]
st = st+"]"
return st
def toFaktorenListe(self):
liste = []
self.eggT(self.zaehler,self.nenner,liste)
return liste
##t1 = Bruch(3,4)
##print t1.toString()
##t2 = Bruch(1,4)
##print t2.toString()
##b1 = t1.add(t2)
##print b1.toString()
##b2 = t1.sub(t2)
##print b2.toString()
##b3 = t1.mul(t2)
##print b3.toString()
##b4 = t1.div(t2)
##print b4.toString()
##
##b2gekuerzt = b2.clone()
##b2gekuerzt.kuerzen()
##print b2.toString() + " = "+b2gekuerzt.toString()
##
##print "*****************************************"
##
##t1 = EffizienterBruch(3,4)
##print t1.toString()
##t2 = EffizienterBruch(1,4)
##print t2.toString()
##b1 = t1.add(t2)
##print b1.toString()
##b2 = t1.sub(t2)
##print b2.toString()
##b3 = t1.mul(t2)
##print b3.toString()
##b4 = t1.div(t2)
##print b4.toString()
##
##b2gekuerzt = b2.clone()
##b2gekuerzt.kuerzen()
##print b2.toString() + " = "+b2gekuerzt.toString()
##
##liste = [1]
##for i in range(2,10):
## liste.append(i)
## k = KettenBruch(liste)
##
##print k.toString()