Leetcode之Divide Two Integers

    这道题的技巧在于,使用减法来做除法。题目意思是说:不使用乘法和除法来实现除法。那么我们只能用减法罗。有很多细小的字节需要处理。

    特别是如何加速使用减法。这种做法是每次使用sum+=sum来实现堆滚累加,计算的时候使用long long型来进行加法和减法,以防止溢出。具体代码实现如下:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution
{
public:
     int divide( int dividend,  int divisor)
    {
         // Start typing your C/C++ solution below
         // DO NOT write int main() function

         if (dividend ==  0 || divisor ==  0)
             return  0;

         int nega =  0;
         if ((dividend >  0 && divisor <  0) || (dividend <  0 && divisor >  0))
            nega =  1;

         long  long c = dividend;     //先用两个long long来存一下,不然下面abs(-2147483648)会溢出,因为正数int只能到2147483647
         long  long d = divisor;
         long  long a = abs(c);
         long  long b = abs(d);

         if (b > a)
             return  0;

         long  long sum =  0;
         int count =  0;
         int final =  0;
         while (a >= b)
        {
            count =  1;                 //a >= b保证了最少有一个count
            sum = b;
             while (sum + sum <= a)      //!!
            {
                sum += sum;
                count += count;
            }
            a -= sum;
            final += count;
        }

         if (nega)
            final =  0 - final;

         return final;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值