题目描述
不使用乘法、除法和模运算符来除两个整数。
解题思路
注意:此题操作对象为两个整数,不是两个正整数,因此要对符号进行判断
基本解法:对被除数循环减除数,问题:算法效率不高,当被除数很大,除数很小时,效率会非常低。
改进解法:每次循环递减时,将递减数翻倍,这样算法效率能够得到极大优化
代码示例
class Solution {
public: int divide(int dividend, int divisor) {
if (!divisor || (dividend == INT_MIN && divisor == -1))
return INT_MIN;
int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1;//判断符号
long dvd = labs(dividend);
long dvs = labs(divisor);
int res = 0;
while (dvd >= dvs) {
long temp = dvs, multiple = 1;
while (dvd >= temp << 1) {//temp<<1,表示temp的平方,即翻倍
temp <<= 1;
multiple <<= 1;
}
dvd -= temp;
res += multiple;
}
return sign > 0 ? res : ~(res - 1);//添加符号
}
};