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.