题目描述:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
解题思路:
用减法代替除法,并使除数翻倍不断逼近。
预先处理好边界情况,如除数为0,1,-1。
将计算的ab都调整为负数,且sum-a+sum语句不可换位,否则若写成sum+sum-a会越界。
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor==0){ //除数为0
return 0;
}
if(divisor==1){ //除数为1
return dividend;
}
int flag=0,res=0;
if(divisor==-1){ //除数为-1,越界
if(dividend>INT_MIN){
return -dividend;
}
return INT_MAX;
}
if((dividend>0&&divisor>0)||(dividend<0&&divisor<0)){ //判断正负
flag=1;
}
dividend=dividend>0?0-dividend:dividend;
divisor=divisor>0?0-divisor:divisor;
res=div(dividend,divisor);
return flag>0?res:0-res;
}
int div(int a,int b){ //除法实现
if(a>b){
return 0;
}
int count=1,sum=b;
while(sum-a+sum>=0){ //若除数的2倍仍小于被除数
count+=count;
sum+=sum;
}
return count+div(a-sum,b); //减去该数量级后继续递归逼近
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。