题意
给定两个整数,被除数 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
思路
1.正数2^31-1,负数-2^31.我们把正数转换为负数计算
2.符号的判断,取决于除数和被除数
3.使用类似于2进制表示数的做法,也叫倍增,例如:10 = 2^1+2^3
3.使用除数作为基底,然后不断的遍历,去接近答案,直到被除数<除数,指数就是所求答案
例如:10 3 3^1+3^2 --> 3
代码
class Solution {
public:
int divide(int dividend, int divisor) {
int x = dividend ,y = divisor;
//判断符号,0是正数
bool flag = (x>0) ^ (y>0);
//全部都变成负数
if (x > 0) x = -x;
if (y > 0) y = -y;
int res = 0;
while (x <= y){
int t = y,c = -1;//转成了负数,所以为-1
while ((INT_MIN-t) <= t && x <= t + t ){
t += t;
c += c;
}
res += c;
x -= t;
}
if (!flag ){
if (res == INT_MIN){
return INT_MAX;
}
return -res;
}
return res;
}
};