Python :: Aufgabe #238

3 Lösungen Lösungen öffentlich

Ägyptische Bruchrechnung

Fortgeschrittener - Python von hollst - 22.12.2019 um 22:50 Uhr
Gegeben seien zwei positive Ganzzahlen Z (wie Zaehler) und N (wie Nenner) mit N > Z
und Z sei kein Teiler von N.

Der Bruch Z/N ist immer als Summe der Kehrwerte positiver Ganzzahlen (Stammbrüche) darstellbar,
wobei es meist mehrer Möglichkeiten der Darstellung gibt.

Beispiele:

5/6 = 1/2 + 1/3 = 1/2 + 1/4 + 1/12 = 1/2 + 1/4 + 1/13 + 1/156 = ...

17/39 = 1/3 + 1/10 + 1/390 = ...

Man schreibe ein Programm, das Z und N entgegennimmt und die Zahlen der Stammbrüchesumme mit den wenigsten Summanden ausgibt.

Also obere Beispiele:

Input 5 und 6, Output 2 und 3,
Input 17 und 39, Output 3, 10 und 390.

Viel Spaß.

Lösungen:

vote_ok
von Klaus (730 Punkte) - 06.02.2020 um 12:30 Uhr
Quellcode ausblenden Python-Code
from fractions import Fraction as Fr


class EgyptFraction:

    def __init__(self, numerator, denominator):
        self.numerator = numerator
        self.denominator = denominator
        self.list_of_fractions = []
        if self.numerator >= self.denominator:
            print('Falscher Wert. Der Zähler soll kleiner als der Nenner sein.')
        elif self.denominator % self.numerator == 0:
            print('Falscher Wert. Der Zähler soll kein Teiler vom Nenner sein.')
        else:
            self.return_denominators()

    def return_denominators(self):
        remaining_fraction = Fr(self.numerator, self.denominator)

        while remaining_fraction.numerator != 1:
            calculated_fraction = Fr(remaining_fraction.numerator, self.__lowest_multiple(remaining_fraction))
            self.list_of_fractions.append(calculated_fraction)
            remaining_fraction = remaining_fraction - calculated_fraction
        self.list_of_fractions.append(remaining_fraction)

        return_list = []
        for element in self.list_of_fractions:
            return_list.append(element.denominator)

        print(f'Der Bruch {self.numerator}/{self.denominator} hat die '
              f'Stammbruch-Zahlen {[x.denominator for x in self.list_of_fractions]}')

    @staticmethod
    def __lowest_multiple(fraction):
        index = 1
        while True:
            if fraction.numerator * index >= fraction.denominator:
                return fraction.numerator * index
            else:
                index += 1

if __name__ == '__main__':
    e1 = EgyptFraction(5, 6)
    e2 = EgyptFraction(17, 39)
    e3 = EgyptFraction(14, 3)
    e4 = EgyptFraction(4, 12)
vote_ok
von kaschperl (210 Punkte) - 20.02.2020 um 19:09 Uhr
Quellcode ausblenden Python-Code
from decimal import Decimal

zaehler = Decimal(input('Zähler: '))
nenner = Decimal(input('Nenner: '))

if zaehler > nenner:
    print("Kein Ergebnis! Zähler muss kleiner als der Nenner sein!")
else:
    test = 1
    while zaehler > 0:
        test = test + 1
        if zaehler / nenner >= 1 / test:
            print(test)
            zaehler = zaehler - (nenner / test)
            test = 1
vote_ok
von satn1241 (1950 Punkte) - 02.04.2020 um 15:07 Uhr
Quellcode ausblenden Python-Code
def kgv(Zahl1, Zahl2):
    while True:
        i = 1
        while True:
            d = i * Zahl1
            r2 = d % Zahl2
            if r2 == 0:
                break
            i += 1
        break
    return d

def ggt(zahl1, zahl2):
    while zahl2!=0:
        c=zahl1%zahl2
        zahl1=zahl2
        zahl2=c
    return zahl1

# Code Ägyptische Bruchrechnung
# Eingabe
print("Wilkommen bei der ägyptischen Bruchrechnung. Der Nenner muss hier größer als der Zähler sein!")
zaehler = int(input("Gib einen Zaehler ein:   "))
nenner = int(input("Gib einen Nenner ein:   "))
# Prüfe, ob der Bruch gekürzt werden kann
ggt_neu = ggt(zaehler, nenner)
if ggt_neu != nenner:
    zaehler = zaehler / ggt_neu
    nenner = nenner / ggt_neu
   
bruch = zaehler/nenner   
nenner_neu = nenner//zaehler+1 

while True:
    # Prüfe, ob der Bruch schon gekürzt wurde
    if zaehler ==1:
        break
    # regulärer Algorithmus
    print("Ein Stammbruch ist: 1/"+ str(int(nenner_neu)))
    nenner = kgv(nenner_neu, nenner)
    rest = round((bruch - 1/nenner_neu)*nenner,0)  
    nenner_neu = nenner//rest+1     
    bruch = rest/nenner      
    if rest ==1:
        break
print("Ein Stammbruch ist: 1/"+ str(int(nenner)))