29. Divide Two Integers

来源:互联网 发布:公司网络屏蔽qq 编辑:程序博客网 时间:2024/06/06 00:21

题意很简单,不用乘除以及取余符号做两个数的除法。

其实用减法就可以,用被除数不断减去除数,但是这样做我感觉会超时……

然后我大概的思路就是先将被除数不断左移直到即将要比被除数大的时候,然后拿被除数减去除数,然后除数再左移至比新的被除数小,然后重复上述步骤直到被除数为0.

需要注意的是有两个坑,一个是关于-2147483648,-1这个特殊用例,一开始没有排除这个特殊用例,后来发现不管输出res还是-res,结果都是-2147483648。觉得有点纳闷。后来想了一下大概是这样子的吧。因为之前的res定义为long long,也就是000…………01000…………0之后强制截断成int,二进制表示也就是1000…………0。这个在C++里只有一个表示就是-2147483648。结果溢出,需要特殊处理排除。

另一个就是网上盛行的一个产生符号的方法是将数字右移31位之后判断符号位。

int neg=((dividend^divisor)>>31)?1:0;

但是这样有点杀鸡用牛刀也……没必要而且很慢好吗……直接判断正负就可以了为什么要移位呢……

就像这样

int neg=((dividend < 0) ^ (divisor < 0))?1:0;

我换了一下以后快了很多……从18ms到了9ms!

丢代码

class Solution {public:    int divide(int dividend, int divisor) {                if(dividend==INT_MIN&&divisor==-1) return INT_MAX;       int neg=((dividend < 0) ^ (divisor < 0))?1:0;                long long a=abs(double(dividend));        long long b=abs(double(divisor));        if(a<b) return 0;        int res=0;        int i=0;        for(i;a>=b<<1;i++){            b<<=1;        }        for(i;i>=0;i--,b>>=1){            if(a>=b) {a-=b; res+=1<<i;}        }        if(res>INT_MAX) return INT_MAX;        return neg?-res:res;    }};


0 0
原创粉丝点击