题目
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
思路
不能用乘除模,开始想只能用减法了,但一个个减会TLE。后来发现还有位运算…。
(感觉有点作弊啊,位运算也算是乘除法了
解法就是对于被除数,两倍两倍的减,有点树状数组的意思。
此外要考虑溢出的问题,存在unsign int
边界的case,把它们全都转成long long会比较方便。
就是一道考位运算的题,记得还有这个东西就好了
代码
class Solution {
public:
int divide(int dividend, int divisor) {
bool flag=false;
if((divisor<0&÷nd>0) || (divisor>0&÷nd<0))
flag=true;
long long int dividendt=abs((long long int)dividend);
long long int divisort=abs((long long int)divisor);
long long int res=0;
while(dividendt>=divisort)
{
long long int m=1;
long long int n=divisort;
while(dividendt>=(n<<1))
{
n<<=1;
m<<=1;
}
dividendt-=n;
res+=m;
}
if(flag)
res=0-res;
if(res>INT_MAX||res<INT_MIN)
return INT_MAX;
return res;
}
};