import string def fractionizer(frac): """Simplify or find the closest fraction from frac. Returns a string like N / D or simply N .""" numbers =string.split(frac,'/') if len(numbers) == 1: number = float(numbers[0]) else: number = float(numbers[0] )/ float(numbers[1]) numerator =long(number) denominator = 1 oldNumerator = 1 oldDenominator = 0 f = number g = numerator while abs( float(numerator)/float(denominator) - number) > 1E-8 : f = 1 / (f - g) g = long(f) newNumerator = g*numerator + oldNumerator newDenominator = g* denominator + oldDenominator oldNumerator = numerator oldDenominator =denominator numerator = newNumerator denominator = newDenominator if denominator <> 1 : return str(numerator)+"/"+str(denominator) return str(long(numerator)) if __name__ == "__main__": testSample = ( ("1.3333333333", "4/3"), ("25/5", "5"), ("8/7","8/7"), ("20/25","4/5"), ("6.55957","81155/12372")) for frac,validResult in testSample: result = fractionizer(frac) if result == validResult: print frac + " => " + result else: print "ERROR "+ validResult + "expected" + result +" found"