29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
1 2
| 输入: dividend = 10, divisor = 3 输出: 3
|
示例 2:
1 2
| 输入: dividend = 7, divisor = -3 输出: -2
|
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public: int divide(int dividend, int divisor) { const int HALF_INT = 1 << 30; if(divisor == INT_MIN) { if(dividend == INT_MIN) { return 1; } else { return 0; } } else { int flag = 1, add = 0; if(dividend < 0) { if(dividend == INT_MIN) { if(divisor == -1) { return INT_MAX; } else if (divisor == 1) { return INT_MIN; } add = 1; dividend = INT_MAX; } else { add = 0; dividend = -dividend; } flag = (flag == -1 ? 1 : -1); } if(divisor < 0) { flag = (flag == -1 ? 1 : -1); divisor = -divisor; } int cnt = 0, bs = divisor; while(bs < HALF_INT && bs < dividend) { bs <<= 1; cnt++; } int res = 0; for(int i = cnt; i >= 0; --i, bs >>= 1) { while(dividend >= bs) { dividend -= bs; res += 1 << i; if(add) { dividend += add; add = 0; } } } return flag == -1 ? -res : res; } } };
|
解释:npy帮忙写的…我还没看…
v1.5.2