基本思想:
溢出问题+快速幂+快速乘+二分;
个人觉得目前遇到数学运算最难的一道了;
注意一下加法模拟快速乘和快速幂;
具体代码:
class Solution {
public:
bool quckadd(int y, int z, int x) {
//y除数,z商,x被除数,y,x都为负数;
//判断z*y<x;
int result = 0, add = y;
while (z) {
if (z & 1) {
if (result < x - add) {
//实际判断result+add<x?,由于负数加法,可能溢出,所以公式转换;
return false;//当前数过大;
}
result += add;
}
if (z != 1) {
//当z=1,最后循环,不用累加了;
if (add < x - add) {
return false;
}
add += add;
}
z >>= 1;
}
return true;//需要增大z;
}
int divide(int dividend, int divisor) {
//diviosr,除数,divident,被除数;
if (dividend == INT_MIN) {
if (divisor == 1) {
return INT_MIN;
}
if (divisor == -1) {
return INT_MAX;
}
}
if (divisor == INT_MIN) {
return dividend == INT_MIN ? 1 : 0;
}
if (dividend == 0)
return 0;
if(divisor==1)
return dividend;
bool flag = false;
if (dividend > 0) {
dividend = -dividend;
flag = !flag;
}
if (divisor > 0) {
divisor = -divisor;
flag = !flag;
}
int left = 1, right = INT_MAX, ans = 0;
while (left < right) {
int mid = left + ((right - left) >> 1);
if (quckadd(divisor, mid, dividend)) {
ans = mid;
if (mid == INT_MAX) {
break;
}
left = mid + 1;
}
else {
right = mid;
}
}
return flag ? -ans : ans;
}
};