Ir para o conteúdo

Fracções irredutíveis

Este código surgiu no seguimento de um desafio proposto na secção de Desafios: [Proposta] Fracção irredutível.

O código está feito em Python 3.

def mdc(n, d):
    f = [i for i in range(2, max([n, d]) // 2) if n%i == d%i == 0]
    if f == []:
        return str(int(n // d)) if n % d == 0 else "{0}/{1}".format(int(n), int(d))
    else:
        return "{0}/{1}".format(int(n // max(f)), int(d // max(f))) if mdc(n // max(f), d // max(f)) == "{0}/{1}".format(int(n // max(f)), int(d // max(f))) else mdc(n // max(f), d // max(f))

def frac(n):
    n2 = n
    contador = 1
    while not int(n2) == n2:
        n2 = round(n2 + n, 10)
        contador += 1
    return mdc(int(n2), int(contador))

numero = input()

import sys
try:
    if numero.count(".") == 0 and numero.count("/") == 1:
        partes = numero.split("/")
        print(mdc(int(partes[0]), int(partes[1])))
    else:
        partes = numero.split(".")

        if len(partes[1]) == partes[1].count(partes[1][0]) >= 10:
            partes[1] = '(' + partes[1][0] + ')'

        if partes[1].count(")") == partes[1].count("(") == 1:
            if partes[1].endswith(")"):
                dec = partes[1].split("(")
                dec[1] = dec[1].strip(")")

                denominador = 9 * (len(dec[0]) * 10)
                if denominador == 0:
                    denominador = 1
                numerador = int(dec[1])
                fraccao1 = mdc(numerador, denominador).split("/")
                if dec[0] != '':
                    fraccao2 = frac(int(dec[0]) / 10).split("/")
                else:
                    fraccao2 = ['0', '1']
                if len(fraccao2) == 1:
                    fraccao2.append('1')
                if len(fraccao1) == 1:
                    fraccao1.append('9')

                print(mdc(int(partes[0]) * int(fraccao1[1]) * int(fraccao2[1]) + int(fraccao1[0]) * int(fraccao2[1]) + int(fraccao2[0]) * int(fraccao1[1]), int(fraccao1[1]) * int(fraccao2[1])))

            else:
                print("Formato invalido")
        else:
            print(frac(float(numero)))
except:
    print("Erro: {0}".format(sys.exc_info()[0]))

Solução proposta por thoga31.