Функция упрощения дроби не работает должным образом в Python

#python #function #fractions

#python #функция #дроби

Вопрос:

я создал упрощающую функцию, и она работает нормально, но не идеально.

 def gcd(a, b):

    while b > 0:
        if a == 0:
            return b
        a, b = b, (a % b)

def add_frac(n1, d1, n2, d2):

    g = gcd(d1, d2)
    
    frac = (((n1 * d2)   (n2 * d1)) // g, (d1 * d2) // g)
    return frac
 

когда я пытаюсь: print(add_frac(1, 2, 1, 6)) он возвращает (4, 6). Я хочу, чтобы это было (2, 3). Любая помощь для получения этого результата? Внимание!Я хотел бы получить результат без использования import math

Пример, который работает: print (add_frac(1, 2, 1, 4)) дает (3, 4)

Ответ №1:

Используя вашу методологию, просто найдите GCD результирующего числителя и знаменателя и разделите на это

 def add_frac(n1, d1, n2, d2):
    num = (n1*d2   n2*d1)
    den = d1*d2
    g = gcd(num,den)
    return num/g, den/g
 

Комментарии:

1. Это работает, но результатом является значение с плавающей запятой. Где бы я мог ее изменить, чтобы получить interger?

2. Вы можете разделить пол // вместо обычного разделения.

Ответ №2:

Одним из вариантов было бы использовать модуль дроби в python

 >>>print(Fraction(1, 2)   Fraction(1, 6))
>>>2/3
 

Или, если вы хотите написать собственный код на python, измените метод gcd на

 def gcd(a,b):
    if(b==0):
        return a
    else:
        return gcd(b,a%b)
 

и добавьте метод_frac к

 def add_frac(n1, d1, n2, d2):

    g = gcd(d1, d2)
    frac = ((d1/g)*n1   (d2/g)*n2, g)
    return frac
 

Обратите внимание, что, поскольку мы уже нашли gcd, нам не нужно разделение по этажам (//), поскольку мы знаем, что d1 и d2 будут делиться на g