Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
做除法,没有想到官网标准答案位运算,MAX_INT除1,用加减法循环算子一直是1,显然效率是问题
想到的做法是用新的算子做被减数,用 去逼近除数,
最后结果应该是:一个二次抛物线,在x=正整数时的一点y值的和,恰好等于除数。
具体代码如下:
int divide(int dividend, int divisor) {
if (divisor == 0) {
return INT_MAX;
}
if (dividend == 0 || (dividend != INT_MIN && (divisor == INT_MIN || abs(dividend) < abs(divisor)))){
return 0;
}
// dividend == INT_MIN || abs (dividend) >= abs(divisor)
int mreturn = 0;
bool mchar = false; // -
if (dividend < 0 && divisor < 0 || dividend > 0 && divisor > 0) {
mchar = true; // +
}
if (dividend == INT_MIN) {
if (divisor == INT_MIN) {
return 1;
}
else {
dividend += abs(divisor);
mreturn += 1;
}
}
dividend = abs(dividend);
divisor = abs(divisor);
int mdivide = 0;
if (dividend >= divisor) {
int upStairs = divisor;
int time = 1;
while (dividend >= upStairs) { // upstairs
dividend -= upStairs;
mdivide += time;
upStairs += divisor;
++time;
if (upStairs < 0) {
break;
}
}
int downStairs = upStairs - divisor;
--time;
while (dividend >= divisor) { // downstairs
if (dividend >= downStairs) {
dividend -= downStairs;
mdivide += time;
}
downStairs -= divisor;
--time;
}
}
if (mchar) { // +
return (mreturn + mdivide) < 0 ? INT_MAX : (mreturn + mdivide);
}
else { // -
return (-mreturn - mdivide) > 0 ? INT_MAX : (-mreturn - mdivide);
}
}
欢迎批评指正。