题意:
不用*/和%实现除法计算,返回int,如果超过int最大值则返回最大值。
思路:
一开始想到了高精度模拟,但还是要用*/%。后来才想到位运算这回事。
基本思想都是试商法,只不过用位运算的时候,试的是答案的二进制位。符号通过被除数和除数异或来计算。
注意细节,除数为0。还有数据类型要用long long,要不然INT32_MIN没有对应的int正数!!
代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0) {
return 2147483647;
}
bool positive = (dividend ^ divisor) >= 0;
long long ans = 0, d = dividend, f = divisor;
int shift = 31;
for (d = d >= 0 ? d : -d, f = f >= 0 ? f : -f; d >= f; --shift) {
if (d >= f << shift) {
d -= f << shift;
ans += 1L << shift;
}
}
ans = positive ? ans : -ans;
return ans >= 2147483647 ? 2147483647 : ans;
}
};