Python :: Aufgabe #238 :: Lösung #1

3 Lösungen Lösungen öffentlich
#238

Ä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ß.
#1
vote_ok
von Klaus (1960 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)

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2103847

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.