好久没写过算法方面的代码了,偶然翻开《编程之美》看到了这个题,拿来写写。具体算法在《编程之美》2.6和2.7。
#! /usr/bin/python
def is_even(x):
if 0 == (x & 1):
return True
else:
return False
def cal_gcd(x, y):
if x < y:
return cal_gcd(y, x)
if 0 == y:
return x
if is_even(x):
if is_even(y):
return (cal_gcd(x >> 1, y >> 1) << 1)
else:
return cal_gcd(x >> 1, y)
else:
if is_even(y):
return cal_gcd(x, y >> 1)
else:
return cal_gcd(x - y, y)
def decimal_to_fraction(x):
i, temp = str(x).split('.')
i = long(i)
num = 0
den = 0
pos = temp.find('(')
if -1 != pos:
a = 0
if pos > 0:
a = long(temp[0:pos])
b = long(temp[pos + 1:-1])
if 0 != b:
num = a * (10 ** (len(temp) - pos - 2) - 1) + b
den = (10 ** (len(temp) - pos - 2) - 1) * (10 ** pos)
else:
num = a
den = 10 ** pos
else:
num = long(temp)
den = 10 ** len(temp)
num += (i * den)
g = cal_gcd(num, den)
return str(num / g) + ' / ' + str(den / g)
if __name__ == '__main__':
try:
dec = str(raw_input())
ans = decimal_to_fraction(dec)
print(ans)
except Exception, e:
print('exception: ', e)