题目
Divide two integers without using multiplication, division and mod operator.
不使用乘除法实现除法功能。
思路:通过减法实现,先假设数全都是正数。
1、左移操作可以时数乘2,右移则除2。
2、求商其实就是求商的各个位。
所以,把除数左移x+1位后大于被除数,而左移x位后后小于等于被除数,说明1左移x位后是商的最高位,且为1。
被除数=被除数-(除数<<x);重复。
步骤:
1、先把数全转换为64位数据,防止溢出(2、中取绝对值过程可能导致溢出)
2、全部取绝对值,判断商的正负性
3、由商的最高位开始向低位依次求取
代码:
class Solution {
public:
int divide(int dividend, int divisor) {
long long ans=0;
long long did=dividend; //被除数转成64位
long long dis=divisor; //除数转换成64位
int flag_minus=0; //结果是否是负数的标志
if(did<0) //被除数转成正数
{
did=-did;
flag_minus=1;
}
if(dis<0) //除数转成正数
{
dis=-dis;
flag_minus=flag_minus^1;
}
long long divid=1; //结果的某一位
while((dis<<1>dis)&&(dis<<1<=did)) //求结果的最高位
{
dis=dis<<1;
divid=divid<<1;
}
while(divid>0) //从高位向低位依次求每一位的值
{
if(dis<=did)
{
did-=dis;
ans+=divid;
}
dis=dis>>1;
divid=divid>>1;
}
if(flag_minus==1) //处理正负
return -ans;
else
return ans;
}
};
不使用64位,仅通过int的实现:
class Solution {
public:
int divide(int dividend, int divisor) {
int ans=0;
int flag_minus=0; //结果是否是负数的标志
if(dividend<0)
flag_minus=1;
else
dividend=-dividend;
if(divisor<0)
flag_minus=flag_minus^1;
else
divisor=-divisor;
int divid=-1;
while((divisor<<1<divisor)&&(divisor<<1>=dividend))
{
divisor=divisor<<1;
divid=divid<<1;
}
while(divid<0)
{
if(divisor>=dividend)
{
dividend-=divisor;
ans+=divid;
}
if(divid==-1)
break;
divisor=divisor>>1;
divid=divid>>1;
}
if(flag_minus==0)
return -ans;
else
return ans;
}
};