【题目】
Divide two integers without using multiplication, division and mod operator.
【题意】
计算两个数的商,不能使用乘、除、取余操作
【思路】
用加法,确定多少除数相加其和恰好<=被除数为了提高算法效率,利用贪心思想,采用滚雪球式的翻倍叠加策略,使和快速逼近被除数
几种特殊情况需要注意:
1. 结果是负数
2. 除数的绝对值要比被除数的绝对值大
3. 除数是0
4. 被除是0
5. 注意除数翻倍累加时越界,超过int的上界
【代码】
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor==0 || dividend==0)return 0;
if(divisor==1)return dividend;
if(divisor==-1)return 0-dividend;
bool isNegative=false;
if((dividend<0&&divisor>0)||(dividend>0&&divisor<0))isNegative=true; //判断正负
long long dend=dividend;
long long dsor=divisor;
long long totalSum=0; //为了防止越界情况的发生,使用long long类型
long long sum=0;
int totalCount=0;
int count=0;
if(dend<0)dend=abs(dend); //取正
if(dsor<0)dsor=abs(dsor);
while(sum+dsor<=dend-totalSum){
count=1;
sum=dsor;
while(sum+sum<=dend-totalSum){
sum+=sum;
count+=count;
}
totalSum+=sum;
totalCount+=count;
sum=0;
count=0;
}
if(isNegative)return 0-totalCount;
else return totalCount;
}
};