码迷,mamicode.com
首页 > 其他好文 > 详细

29. Divide Two Integers

时间:2015-12-21 20:20:59      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

这个题分了两种解法,本质都是一样的:

方法一:都是每次减去divisor 的2^i 倍sum,其中sum<=dividend<2*sum;

代码:

 1 class Solution {
 2 public:
 3 int divide(int dividend, int divisor)
 4 {
 5     int falg=0;
 6     bool m=false;
 7     if (dividend==0||divisor==0)
 8     {
 9         return 0;
10     }
11     if ((dividend<0&&divisor>0)||(divisor<0&&dividend>0))
12     {
13         falg=1;
14     }
15     if (divisor==1)
16     {
17         return dividend;
18     }
19     if (divisor==-1&&dividend==-2147483648)
20     {
21         return 2147483647;
22     }
23     long long div=dividend;
24     if (dividend<0)
25     {
26         div=-div;
27     }
28     long long num=divisor;
29     if (divisor<0)
30     {
31         num=-num;
32     }
33     long long s=num;
34     long long n=1;
35     long long sum=0;
36     while(div>=num)
37     {
38         num=2*num;
39         n=2*n;
40         m=true;
41     }
42     if (m)
43     {
44         num=num/2;
45         n=n/2;
46     }
47     while(div>=s)
48     {
49         if (div>=num)
50         {
51             sum+=n;
52             div=div-num;
53         }
54         num=num/2;
55         n=n/2;
56     }
57     if (falg==0)
58     {
59         if (sum>2147483647)
60         {
61             return 2147483647;
62         }
63     }
64     else
65         return -sum;
66 
67     return sum;
68 }
69 };

方法二:本质跟方法一相同,但使用移位代替乘2,所以更快些,我看到其他一些博客中也是同样的代码,只是有些边界条件没有考虑,下面代码加入边界条件,可正确运行。

代码:

class Solution {
public:
int divide(int dividend, int divisor)
{
    if (dividend==0||divisor==0)
    {
        return 0;
    }
    if (divisor==1)
    {
        return dividend;
    }
    if (divisor==-1&&dividend==-2147483648)
    {
        return 2147483647;
    }
    long long a=dividend;
    long long b=divisor;
        int sign = 1;
        if(a < 0){
            a = -a;
            sign=sign*(-1);
        }
        if(b < 0){
            b = -b;
            sign=sign*(-1);
        }
        int d = 0;
        while ( (b << d) <= a )
        {
            ++d;
        }
        --d;
        int res = 0;
        for (int i = d; i >= 0; --i)
        {
            if ( (b << i) <= a )
            {
                res += (1 << i);    // high to low
                a -= (b << i);      // remaider
            }
        }
        if(sign * res)
            return sign * res;
}
};

在使用时间方面,方法一用时16ms,方法二用时8ms,由此可看出优劣。

29. Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/zhang-hill/p/5064650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!