UPDATE: 新函数cmpfrac()可以用来求循环节长度.
将分数转换为循环小数,默认处理1/d的情况,输出50位.稍加修改,可以变成处理互质的a/b的程序.
代码如下:
# compute decimal string of 1/d, defualt 50 length def frac2num(d,n=50): s = '0.' # result rem = 10 # remainder i = 0 # number of digits after dot while i<n: s += str(rem/d) # division i += 1 # number increase rem = rem%d # get the remainder if rem==0: # fully divided break rem *= 10 # next division return stest code
print frac2num(884,100) 0.0011312217194570135746606334841628959276018099547511312217194570135746606334841628959276018099547511
updated version:
可以检测循环小数的循环节,写成1/3 = 0.(3)的形式,如果是整除,直接除尽,没有循环节.
def cmpfrac(a,b):
flag = 0
c,r = divmod(a,b)
## print c,r
s = []
rs = [r]
## print rs
r *= 10
while True:
c1,r1 = divmod(r,b)
## print s,r,'/',b,'=',c1,'...',r1
if r1==0:
flag = 1
s.append(str(c1))
break
elif r1 in rs:
flag = 0
s.append(str(c1))
s.append(str(s[rs.index(r1)]))
rs.append(r1)
break
else:
s.append(str(c1))
rs.append(r1)
r = r1*10
print a,b,c
if flag:
return str(c)+'.'+''.join(s)
else:
# for 29/12 = 2.41(6)
## print s
## print ''.join([str(c) for c in rs])
d = s.index(s[-1])
result = str(c)+'.'+''.join(s[:d])+'('+''.join(s[d:-1])+')'
print result
return result
No comments :
Post a Comment