[LeetCode]题解(python):029-Divide Two Integers

题目来源:

  https://leetcode.com/problems/divide-two-integers/


 

题意分析:

  不用乘法,除法和mod运算来实现一个除法。如果数值超过了int类型那么返回int的最大值。


 

题目思路:

  初步来说,有两个做法。

  ①模拟除法的过程,从高位开始除,不够先右挪一位。这种方法首先要将每一位的数字都先拿出来,由于最大int类型,所以输入的长度不超过12位。接下来就是模拟除法的过程。

  ②利用左移操作来实现出发过程。将一个数左移等于将一个数×2,取一个tmp = divisor,所以将除数tmp不断左移,直到其大于被除数dividend,然后得到dividend - tmp,重复这个过程。


 

代码(python):

 1 class Solution(object):
 2     def divide(self, dividend, divisor):
 3         """
 4         :type dividend: int
 5         :type divisor: int
 6         :rtype: int
 7         """
 8         ispositive = True
 9         if dividend > 0 and divisor < 0:
10             ispositive = False
11         if dividend < 0 and divisor > 0:
12             ispositive = False
13         dividend = abs(dividend);divisor = abs(divisor)
14         if dividend < divisor:
15             return 0
16         num = [1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000]
17         i = 9
18         newdividend = []
19         while i >= 0:
20             tmp = 0
21             while dividend >= num[i]:
22                 tmp += 1;dividend -= num[i]
23             newdividend.append(tmp); i -= 1
24         tmpm = 0; ans = 0 ;i = 0
25         while i < 10:
26             while tmpm < divisor:
27                 if i > 9:
28                     break
29                 j = 0; t = 0
30                 while j < 10 and tmpm != 0:
31                     t += tmpm; j += 1
32                 tmpm = t + newdividend[i]; i += 1
33                 if tmpm < divisor:
34                     j = 0; t = 0
35                     while j < 10 and ans != 0:
36                         t += ans; j += 1
37                     ans = t
38             if tmpm >= divisor:
39                 k = 0
40                 while tmpm >= divisor:
41                     tmpm -= divisor; k += 1
42                 j = 0; t = 0
43                 while j < 10 and ans != 0:
44                     t += ans; j += 1
45                 ans = t + k
46         if ispositive:
47             if ans > 2147483647:
48                 return 2147483647
49             return ans
50         if ans >= 2147483648:
51             return -2147483648
52         return 0 - ans
53                 
模拟过程
 1 class Solution(object):
 2     def divide(self, dividend, divisor):
 3         """
 4         :type dividend: int
 5         :type divisor: int
 6         :rtype: int
 7         """
 8         ispositive = True
 9         if dividend > 0 and divisor < 0:
10             ispositive = False
11         if dividend < 0 and divisor > 0:
12             ispositive = False
13         dividend = abs(dividend);divisor = abs(divisor)
14         if dividend < divisor:
15             return 0
16         tmp = divisor
17         ans = 1
18         while dividend >= tmp:
19             tmp <<= 1
20             if tmp > dividend:
21                 break
22             ans <<= 1
23         tmp >>= 1
24         nans = ans + self.divide(dividend - tmp,divisor)
25         if ispositive:
26             if ans > 2147483647:
27                 return 2147483647
28             return nans
29         if ans >= 2147483648:
30             return -2147483648
31         return 0 - nans
32                 
左移

 


 

转载请注明出处:http://www.cnblogs.com/chruny/p/4893254.html

转载于:https://www.cnblogs.com/chruny/p/4893254.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值