5.divide-two-integers(两个整数相除)
链接:http://www.lintcode.com/zh-cn/problem/divide-two-integers/
将两个整数相除,要求不使用乘法、除法和 mod运算符。
如果溢出,返回 2147483647 。
分析:不能使用乘法、除法、和mod运算符,容易想到使用位运算。被除数可以表示为除数的2的整数幂的形式,显然时间复杂度是log(n)。为了方便,先把两个数都变成正整数,符号位直接由两个数的正负性即可得到。
注意:要考虑到溢出的情况,可分为以下几种,(1)除数为0,则返回INT_MAX,(2),被除数为最小数,若除数为-1,则直接返回INT_MAX,否则被除数加上除数的绝对值,这样被除数加绝对值时,才不会溢出,此时要给商加一,因为从整数的角度看,相当于被除数减掉一个除数(3)除数为INT_MIN,则直接返回商,要么为0,要么为1(此时,被除数也为INT_MIN)。
class Solution {
public:
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
int divide(int dividend, int divisor) {
// Write your code here
if(divisor==0)
return INT_MAX;
int ret=0;
if(dividend==INT_MIN)
{
dividend+=abs(divisor);
if(divisor==-1)
{
return INT_MAX;
}
ret++;
}
if(divisor==INT_MIN)
return ret;
int flag=(dividend<0)^(divisor<0)?-1:1; //符号位
int n=abs(dividend);
int m=abs(divisor);
int digit=0;
while(m<=(n>>1)) //digit找出2的整数幂的最大值,它与除数相乘即为m
{
m<<=1;
digit++;
}
while(digit>=0)
{
if(n>=m)
{
ret+=(1<<digit); //2的digit次方
n-=m; //被除数减去m
}
m=m>>1; //m缩小2倍
digit--; //digit减一,2的整数次方数
}
if(flag<0) //控制符号位
ret=-ret;
return ret;
}
};