Skip to content

Commit 73e31db

Browse files
committed
除法模块
1 parent 7f6c2b5 commit 73e31db

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

divide.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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

Comments
 (0)