|
| 1 | +#! /usr/bin/env python |
| 2 | +#coding:utf-8 |
| 3 | + |
| 4 | +def divide(numerator, denominator, detect_repetition=True, digit_limit=None): |
| 5 | + |
| 6 | + # 如果是无限小数,必须输入限制的返回小数位数:digit_limit |
| 7 | + # digit_limit = 5,表示小数位数5位,注意这里的小数位数是截取,不是四舍五入. |
| 8 | + if not detect_repetition and digit_limit == None: |
| 9 | + return None |
| 10 | + |
| 11 | + decimal_found = False |
| 12 | + |
| 13 | + v = numerator // denominator |
| 14 | + numerator = 10 * (numerator - v * denominator) |
| 15 | + answer = str(v) |
| 16 | + |
| 17 | + if numerator == 0: |
| 18 | + return answer |
| 19 | + |
| 20 | + answer += '.' |
| 21 | + |
| 22 | + # Maintain a list of all the intermediate numerators |
| 23 | + # and the length of the output at the point where that |
| 24 | + # numerator was encountered. If you encounter the same |
| 25 | + # numerator again, then the decimal repeats itself from |
| 26 | + # the last index that numerator was encountered at. |
| 27 | + states = {} |
| 28 | + |
| 29 | + while numerator > 0 and (digit_limit == None or digit_limit > 0): |
| 30 | + |
| 31 | + if detect_repetition: |
| 32 | + prev_state = states.get(numerator, None) |
| 33 | + if prev_state != None: |
| 34 | + start_repeat_index = prev_state |
| 35 | + non_repeating = answer[:start_repeat_index] |
| 36 | + repeating = answer[start_repeat_index:] |
| 37 | + return non_repeating + '[' + repeating + ']' |
| 38 | + states[numerator] = len(answer) |
| 39 | + |
| 40 | + v = numerator // denominator |
| 41 | + answer += str(v) |
| 42 | + numerator -= v * denominator |
| 43 | + numerator *= 10 |
| 44 | + if digit_limit != None: |
| 45 | + digit_limit -= 1 |
| 46 | + |
| 47 | + |
| 48 | + if numerator > 0: |
| 49 | + return answer + '...' |
| 50 | + return answer |
| 51 | + |
| 52 | +if __name__=="__main__": |
| 53 | + print "5divide2", |
| 54 | + print divide(5,2) |
| 55 | + print "10divide3", |
| 56 | + print divide(10,3) |
| 57 | + print divide(10,3,5) |
| 58 | + print "15divide7" |
| 59 | + print divide(15,7) |
| 60 | + print divide(15,7,True,3) |
| 61 | + |
0 commit comments