leetcode
class Solution {
public:
int divide(int a, int b) {
if(a==INT_MIN&&b==-1)
return INT_MAX;
int ans=0;
if(b==1){
return a;
}
int flag=a>0&&b>0||a<0&&b<0==1?1:0;
if(a>0) a=-a;
if(b>0) b=-b;
if(b==-1)
if(flag==1)
return abs(a);
else
return -abs(a);
if(a>b) return 0;
while(a<=b){
int req=1;
int bb=b;
while(bb>=0xc0000000&&a-bb<=bb){
bb+=bb;
req+=req;
}
ans+=req;
a-=bb;
}
if(flag)
return ans;
else
return -ans;
}
};
思路参考https://leetcode-cn.com/problems/xoh6Oh/solution/jian-zhi-offer-ii-001-zheng-shu-chu-fa-c-l16v/
新版剑指offer第一题,不允许用乘除符号来实现除法。思路:
将被除数与除数都转换为负数,便于统一计算;
当被除数大于除数时,继续循环比较判断被除数是否大于除数的2倍、4倍、2^k倍;
如果被除数最多大于除数的2^ k, 那么将被除数减去除数的2^k倍;
将剩余的被除数重复前面的2、3步骤,由于每次将除数翻倍,因此时间复杂度是O(logN)O(logN)。