29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例1
输入: dividend = 10, divisor = 3
输出: 3
示例2
输入: dividend = 7, divisor = -3
输出: -2
提示:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2的31次方, 2的31次方 − 1]。本题中,如果除法结果溢出,则返回 2的31次方 − 1。
代码
class Solution {
public:
//被除数=除数*2^n+除数*2^(n-1)+.....
//2^n+2^(n-1)+....即就是答案,但是要考虑负数和溢出的特殊情况
int divide(int dividend, int divisor) {
int MAXINT = 2147483647;
int MININT = -2147483648;
long long dividend2=(long long)dividend;
long long divisor2=(long long)divisor;
if(dividend2==divisor2) return 1;
if(dividend2==0) return 0;//被除数为0
if(divisor2==1) return (int)dividend2;//除数为1
//除数为-1
if(divisor2==-1){
if (dividend2 <= MININT) {
return MAXINT;
}
return (int)-dividend2;
}
bool ispositive=true;
//处理负数,将负数转成正数
if(dividend2 <0){
dividend2=-dividend2;
if(divisor2<0){
divisor2=-divisor2;
}
else ispositive=false;
}
else{
if(divisor2<0){
divisor2=-divisor2;
ispositive=false;
}
}
long long ans=0;
long long cnt=1;
//除数不停的左移一位
while(dividend2>=divisor2){
long long tempdivisor=divisor2;
cnt=1;
while(tempdivisor<=dividend2){
tempdivisor <<=1;
cnt <<=1;
}
dividend2-=(tempdivisor>>1);
ans+=(cnt>>1);
}
if(!ispositive) return -ans;
return ans;
}
};