给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333…) = truncate(3) = 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333…) = -2
提示:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。
#define INT_MAX 0X7FFFFFFF
#define INT_MIN 0X80000000
int divide(int dividend, int divisor){
int i,std=0;//std为判定标准,判定两数是否同号
int d1,d2,cnt=0;
if(dividend==INT_MIN && divisor == -1)//被除最小,除数为1,结果为-INT——MIN
return INT_MAX;
else if(dividend==INT_MIN && divisor == 1)
return INT_MIN;
if((divisor>0&÷nd>0)||(dividend<0&&divisor<0))
std=1;
if(divisor==dividend)//无论被除数和除数大小,两数相等,计算结果为1
return 1;
if(divisor==INT_MIN)
return 0;
if(dividend==INT_MIN){
dividend+=abs(divisor);
cnt++;
}//若被除数为INT_MIN,先减一次再运算
d1=abs(dividend);
if(divisor!=INT_MIN)
d2=abs(divisor);
else{
d2=abs(divisor+1);
}
if(d1==d2){
if(std==1)
return 1;
else
return -1;
}
if(d1==0)
return 0;
if(d1==INT_MIN){
d1=d1-1;
cnt++;
}
for(i=31;i>=0;i--){
if((d1>>i)>=d2){
cnt+=1<<i;
d1-=d2<<i;//防止d1除完的余数还是比d2大的情况出现,如果出现就会继续执行if语句
}
}
if(d1==d2)
cnt++;
if(std==0)
cnt=cnt*-1;
return (int)cnt;
}
这道题目,我一开始想到的就是用减法计算,在跨过一道一道坎后发现减法运算时间超时,因此不得不运用位运算(把代码从减法改到位运算感觉还行)。当然,我们首先还得把几种溢出情况排除才能进行计算。