Skip to content

Commit bfe39d9

Browse files
committed
add DivideTwoIntegers
1 parent 3427bdc commit bfe39d9

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

leetcode/DivideTwoIntegers.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# 题目说明
2+
3+
直接使用减法求解,即用被除数逐个减去除数,统计次数,结果超时
4+
5+
```python
6+
class Solution(object):
7+
def divide(self, dividend, divisor):
8+
"""
9+
:type dividend: int
10+
:type divisor: int
11+
:rtype: int
12+
"""
13+
if not divisor:
14+
return -1
15+
res = 0
16+
sign = 0
17+
if dividend < 0:
18+
sign = 1
19+
dividend = abs(dividend)
20+
while (dividend - divisor) >= 0:
21+
res += 1
22+
dividend -= divisor
23+
if sign == 1:
24+
res = -res
25+
return res
26+
```
27+
28+
因为不能使用其他的运算,网上的基本解法都是使用`移位运算`处理,`左移`一位相当于$x * 2 $,`右移`一位相当于$x/2$,所以可以更快地迭代,我这里使用的是近似于等式$x = a_{0}*2^{0}+a_{1}*2^{1} + a_{2}*2^{2}+ \cdots +a_{n}*2^{n}$,然后再把$2^n$累加起来即可,类似一种辗转相除法的变形。实现关键在于处理内外逻辑和变量的迭代上,实现代码如下:
29+
30+
```python
31+
class Solution(object):
32+
def divide(self, dividend, divisor):
33+
"""
34+
:type dividend: int
35+
:type divisor: int
36+
:rtype: int
37+
"""
38+
if not divisor:
39+
return -1
40+
sign = ((dividend >= 0) == (divisor >= 0))
41+
dividend = abs(dividend)
42+
divisor = abs(divisor)
43+
res = 0
44+
while dividend >= divisor:
45+
temp = 1
46+
tempdivisor = divisor
47+
while dividend >= tempdivisor:
48+
tempdivisor = (divisor << temp)
49+
if dividend >= tempdivisor:
50+
temp += 1
51+
res += 2 ** (temp - 1)
52+
dividend -= (tempdivisor >> 1)
53+
if sign == False:
54+
res = -res
55+
return min(max(res, -2147483648), 2147483647)
56+
```
57+

leetcode/DivideTwoIntegers.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#-*- coding:utf-8 -*-
2+
'''
3+
Created on 2017年5月18日
4+
5+
@author: huangjiaxin
6+
'''
7+
class Solution(object):
8+
def divide(self, dividend, divisor):
9+
"""
10+
:type dividend: int
11+
:type divisor: int
12+
:rtype: int
13+
"""
14+
if not divisor:
15+
return -1
16+
sign = ((dividend >= 0) == (divisor >= 0))
17+
dividend = abs(dividend)
18+
divisor = abs(divisor)
19+
res = 0
20+
while dividend >= divisor:
21+
temp = 1
22+
tempdivisor = divisor
23+
while dividend >= tempdivisor:
24+
tempdivisor = (divisor << temp)
25+
if dividend >= tempdivisor:
26+
temp += 1
27+
res += 2 ** (temp - 1)
28+
dividend -= (tempdivisor >> 1)
29+
if sign == False:
30+
res = -res
31+
return min(max(res, -2147483648), 2147483647)
32+
33+
34+
if __name__ == '__main__':
35+
print Solution().divide(10, 3)

0 commit comments

Comments
 (0)