LeetCode29-两数相除-位运算-模拟
作者:互联网
Note:
让算x / y
因为有极端情况会越界(比如说 INT_MIN / -1, 就爆 int 了)先转换成long long,最后算完之后加个判断即可
还有负数的情况,我们设置一个标志位,然后还是全部取绝对值进行运算,最后返回答案的时候在判断一下即可
然后就是正经的计算过程,我们开个数组,里面放着
2^0 * y 2^1 * y ...2^position * y... 2^30 * y
然后每次从数组后面开始判断一下 x 是不是大于等于当前位置的数,如果大于,也就是说x / y >= nums[position] 那么答案的第position位置是1
x -= 2^position * y
res += 2^position
代码如下:
class Solution {
public:
int divide(int x, int y) {
typedef long long LL;
vector<LL> exp;
bool is_minus = false;
if(x < 0 && y > 0 || x > 0 && y < 0) is_minus = true;
LL a = abs((LL) x), b = abs((LL) y);
for(LL i = b; i <= a; i = i + i) exp.push_back(i);
LL res = 0;
for(int i = exp.size() - 1; i >= 0; i --)
if(a >= exp[i]){
a -= exp[i];
res += 1LL << i;
}
if(is_minus) res = -res;
if(res > INT_MAX || res < INT_MIN) res = INT_MAX;
return res;
}
};
标签:int,res,LL,相除,INT,LeetCode29,long,position,两数 来源: https://blog.csdn.net/Mr_Ghost812/article/details/123147667