您的位置:首页 > 其它

LeetCode 29:Divide Two Integers

2015-12-05 21:59 471 查看
Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.
题目要求:利用+,-,移位来实现除法.假设求 dividend / divisor
#include<iostream>
#include<string>
using namespace std;
//最容易的想到的办法,是把除法转化为减法,就像把乘法转化为加法一样,
//提交后发现,这个做法超时了,比如遇到2147483647/3这种时候,
//被除数很大,除数很小,基本都会超时;
//可以利用位运算,每次将除数翻倍,实现加速相减
class Solution{
public:
int divide(int dividend, int divisor){
long long a = abs((long long)dividend); //当dividend=INT_MIN时,-dividend会溢出,所以用long long
long long b = abs((long long)divisor);
long long res = 0;
if (dividend == 0 || divisor == 0) return 0;
if (dividend == INT_MIN && divisor == -1) return INT_MAX;
if (divisor == 1) return dividend;

while (a >= b){
long long c = b;
for (int i = 0; a >= c; i++, c =c << 1){
a -= c;
res += 1 << i;
}
}
return ((dividend^divisor) >> 31) ? -res : res;
//32位int右移31位后剩下的就是符号位,dividend与divisor做异或,判断相除后结果是否为负数
}
};

int main()
{
int a =-2147483648;
int b =2;
Solution sol;
int n = sol.divide(a, b);
cout << n << endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: