一、题目介绍
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
对于二进制数而言,左移(<<)相当于乘以2,右移(>>)相当于除以2。
我们知道在做左除法时,都是先看高位能不能整除除数,再去看低位。比如45/2,可以拆分成40/2和5/2。
三、解题代码
int divide(int dividend, int divisor) {
//特殊判断
if (divisor == 0)
return 0;
if (divisor == 1)
return dividend;
if (dividend == INT_MIN && divisor == -1)
return INT_MAX;
int signdiff = (dividend > 0) ^ (divisor >0);
long t = abs((long)dividend); //此处使用long类型防止越界
long d = abs((long)divisor);
int result = 0;
for (int i = 31; i >= 0; i--) //从高位到低位依次比较和除数的关系
{
if ((t >> i) >= d)
{
result += 1 << i; // 1 << i记录当前位所对应的的进制数,即可以有多少个除数
t -= d << i; //保存除以 d << i后剩余的部分
}
}
return signdiff ? -result : result;
}