class Solution {
//note:
//1. min negative int number->unsigned int
//2. construct divisor table
public:
int divide(int dividend, int divisor) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int sign = 1;
if(dividend < 0) sign *= -1;
if(divisor < 0) sign *= -1;
unsigned int dvd = dividend < 0 ? -dividend : dividend;
unsigned int dvs = divisor < 0 ? -divisor : divisor;
vector<unsigned int> dvsT(32);
int shiftNow = 0;
unsigned int dvsNow = dvs;
while (dvsNow > 0 && dvsNow <= dvd && shiftNow < dvsT.size())//construct divisor table
{
dvsT[shiftNow] = dvsNow;
dvsNow = dvsNow<<1;
shiftNow++;
}
shiftNow--;
//then process
unsigned int res = 0;
unsigned int dvdNow = dvd;
while (dvdNow > 0 && shiftNow >= 0)
{
if (dvsT[shiftNow] <= dvdNow)
{
dvdNow -= dvsT[shiftNow];
res += 1<<shiftNow;
}
shiftNow--;
}
res *= sign;
return res;
}
};
second time
class Solution {
public:
int divide(int dividend, int divisor) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
bool sign = true;
long long first = dividend;
long long second = divisor;
if(first < 0) first = -first, sign = !sign;
if(second < 0) second = -second, sign = !sign;
vector<long long> divideTable;
for(int i = 0; ; ++i)
{
if(second <<i > first) break;
else divideTable.push_back(second<<i);
}
long long ans = 0;
long long curNum = first;
int curIdx = divideTable.size()-1;
while(curNum != 0 && curIdx >= 0)
{
if(curNum >= divideTable[curIdx])
{
curNum -= divideTable[curIdx];
ans += 1<<curIdx;
}
else curIdx--;
}
if(!sign) ans = -ans;
return (int)ans;
}
};