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.