fork(4) download
  1. # Maximo divisor comum
  2. def mdc(n, d):
  3. f = [i for i in range(2, max([n, d]) // 2) if n%i == d%i == 0]
  4. if f == []:
  5. return str(int(n // d)) if n % d == 0 else "{0}/{1}".format(int(n), int(d))
  6. else:
  7. 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))
  8.  
  9. def frac(n):
  10. n2 = n
  11. contador = 1
  12. while not int(n2) == n2:
  13. n2 = round(n2 + n, 10)
  14. contador += 1
  15. return mdc(int(n2), int(contador))
  16.  
  17. numero = input()
  18.  
  19. import sys
  20. try:
  21. if numero.count(".") == 0 and numero.count("/") == 1:
  22. partes = numero.split("/")
  23. print(mdc(int(partes[0]), int(partes[1])))
  24. else:
  25. partes = numero.split(".")
  26.  
  27. if len(partes[1]) == partes[1].count(partes[1][0]) >= 10:
  28. partes[1] = '(' + partes[1][0] + ')'
  29.  
  30. # Verifica se tem parentesis
  31. if partes[1].count(")") == partes[1].count("(") == 1:
  32. if partes[1].endswith(")"):
  33. dec = partes[1].split("(")
  34. dec[1] = dec[1].strip(")")
  35.  
  36. denominador = 9 * (len(dec[0]) * 10)
  37. if denominador == 0:
  38. denominador = 1
  39. numerador = int(dec[1])
  40. fraccao1 = mdc(numerador, denominador).split("/")
  41. if dec[0] != '':
  42. fraccao2 = frac(int(dec[0]) / 10).split("/")
  43. else:
  44. fraccao2 = ['0', '1']
  45. if len(fraccao2) == 1:
  46. fraccao2.append('1')
  47. if len(fraccao1) == 1:
  48. #fraccao1 = ['1'] + fraccao1
  49. fraccao1.append('9')
  50.  
  51. 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])))
  52.  
  53. else:
  54. print("Formato invalido")
  55. else:
  56. print(frac(float(numero)))
  57. except:
  58. print("Erro: {0}".format(sys.exc_info()[0]))
Success #stdin #stdout 0.02s 5824KB
stdin
0.333
stdout
333/1000