De nuevo, la facilidad que ofrece Python para pasar de unos tipos a otros y los módulos estándar que trae hacen que este problema sea trivial.
Se puede compactar más la solución, pero así se ve claro cómo vamos filtrando poco a poco los números candidatos hasta llegar a la solución. También ayuda mucho el enunciado del problema, estableciendo cuántos resultados son esperables.
#!/usr/bin/env python from fractions import Fraction from operator import mul fracts = [] for d in range(10, 100): for n in range(10, 100): if n / d < 1 and n % 10 != 0 and d % 10 != 0: num = str(n) den = str(d) for x in range(1, 10): xstr = str(x) if (num[0] == xstr and den[1] == xstr) or (num[1] == xstr and den[0] == xstr): new_n = int(num.replace(xstr, '', 1)) new_d = int(den.replace(xstr, '', 1)) if (new_n * d == new_d * n): fracts.append(Fraction(new_n, new_d)) print reduce(mul, fracts, 1)
La función "reduce" es muy útil para operar con listas en bloque. Es un atajo para no tener que escribir bucles:
tot = 1 for f in fracts: tot *= f print tot
Así mismo, la clase Fraction es lo suficientemente inteligente para lidiar con enteros, operar con fracciones, simplificarlas,...