思路:
利用减法的思想,直到被减数<减数为止,复杂度为O(N),超时
正确思路:
- 考虑特殊情况,被除数为最小值,变为正数后超过int表示范围
- 都转换正数,找到最大的幂倍的除数,依次相加
class Solution {
public:
int divide(int dividend, int divisor) {
int tag=0;
long long dend=dividend;
long long sor=divisor;
//特殊情况
if(dend==-pow(2,31) && sor==-1)
return pow(2,31)-1;
if(dend==-pow(2,31) && sor==1)
return -pow(2,31);
//cout<<dend<<endl;
if((dend>0 && sor>0) || (dend<0 && sor<0))
tag=1;
dend=abs(dend);
sor=abs(sor);
long long result=0;
long long tmp=0,c=0;
while(dend>=sor)
{//每次重复查找
tmp=sor;
c=1;
while(dend-tmp>=tmp)
{//找到最大的幂倍数
tmp=tmp<<1;
c=c<<1;
}
dend-=tmp;
result+=c;
// cout<<tmp<<" "<<c<<endl;
}
//cout<<"tag:"<<tag<<endl;
if(tag==0)
result=-result;
return result;
}
};