> 文章列表 > 力扣:两数相除

力扣:两数相除

力扣:两数相除

被除数:x
除数:y
xy=k\\rm \\frac{x}{y} = k yx=k
k\\rm kk 用二进制表示,例如 k=26\\rm k = 26k=26,则二进制表示为 110101101011010可将该二进制转换为 24+23+212^4+2^3+2^124+23+21
则将 x\\rm xx 分解如下:
x=24y+23y+21y\\rm x = 2^4y+2^3y+2^1y x=24y+23y+21y
所以将每个 24y,23y,21y\\rm 2^4y,2^3y,2^1y24y23y21y 预存起来,从大到小枚举 24,23,22,21,20\\rm 2^4,2^3,2^2,2^1,2^02423222120,只要 x\\rm xx 大于某一项,则说明该被除数包含该项,答案中加入 2x2^x2x
c++:

class Solution {
public:int divide(int x, int y) {typedef long long LL;LL res = 0;vector<LL> exp;bool minus = false;if(x < 0 && y > 0 || x > 0 && y < 0) minus = true;LL a = abs((LL)x),b = abs((LL)y);for(LL i = b;i <= a;i = i + i) exp.push_back(i); for(int i = exp.size() - 1;i >= 0;i--){if(a >= exp[i]){a -= exp[i];res += 1ll << i;}}if(minus) res = -res;if(res < INT_MIN) res = INT_MIN;if(res > INT_MAX) res = INT_MAX;return (int)res;}
};