给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法:
首先,定下结果的符号,再将除数和被除数取绝对值,最后返回时再加上符号。
接着,函数主体是递归,每次将除数加倍,直到成为小于a的最大倍数,再返回剩余的部分除以除数的商。
针对特殊情况,当被除数为0时,直接返回0,当除数为-1时,若被除数为最小整数,则返回最大整数。
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend==0) return 0;
if (divisor==1) return dividend;
if (divisor==-1 && dividend==INT_MIN){
return INT_MAX;
}
long a=dividend,b=divisor;
int sign=1;
if((a<0&&b>0)||(a>0&&b<0)){
sign=-1;
}
a=abs(a);
b=abs(b);
long res=div(a,b);
if(sign==-1) return -res;
else return res;
}
int div(long a,long b){
if(a<b) return 0;
long k=1;
long kb=b;
while((kb<<1)<a){
kb<<=1;
k<<=1;
}
return (k+div(a-kb,b));
}
};