这一题假设
a/b = k;
k为所求余数,将k拆分成二进制形式
k = (2in + … + 22 + 21 + 20);
所以
a =(2in + … + 22 + 21 + 20) * b
如果 a - 2in*b >= 0,说明所求余数k在二进制第n位上为1,然后a减去2in,而答案res加上2in。
剪完以后的数和2i(n-1)*b继续上述对比…
而难点就在如何建立一个数组,里面装着的值为20*b, 21*b,,,2n*b呢?
for (LL j = b; j <= a; j = j + j) exp.push_back(j);
这么一来就可以装下要求的数组。
class Solution {
public:
int divide(int a, int b) {
typedef long long LL;
vector<LL> exp;
bool is_minus = false;
LL res = 0;
if (a < 0 && b > 0 || a > 0 && b < 0) is_minus = true;
LL x = abs((LL)a), y = abs((LL)b);
for (LL j = y; j <= x; j = j + j) exp.push_back(j);
for (int i = exp.size() - 1; i >= 0; i--) {
if (x - exp[i] >= 0) {
x -= exp[i];
res += (1LL << i);
}
}
if (is_minus) res = -res;
if (res > INT_MAX || res < INT_MIN) return INT_MAX;
return res;
}
};