题目地址:https://oj.leetcode.com/problems/divide-two-integers/
题意就是两个数相除,不能使用除法,乘法,取模运算。
最直接想法就是利用减法,每次减去除数知道被除数小于除数,统计次数,这种方式很直接,但是效率太低,肯定会出现超时错误情况,联想到二分查找,我们每次减去除数的2 、4、6、8。。。等,这样极大加速运算。
public class Solution {
public int divide(int dividend, int divisor) {
if(dividend ==0 || divisor ==0){
return 0;
}
boolean IsNegetive = false;
// 判断商的正负
if((dividend>0 && divisor<0)||(dividend<0 && divisor>0)){
IsNegetive = true;
}
int ans = 0;
//必须使用long型,如果用int 最大负数abs 会溢出
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
long sum = 0;
int count = 1;
while(a>=b){
// 能进循环意味着至少有一次,所以count 初值1,类似二分查找思想,sum 每次加倍,则count也加倍
sum = b;
count = 1;
while(sum+sum<=a){
sum+=sum;
count+=count;
}
a-= sum;
ans+= count;
}
if(IsNegetive)
return 0-ans;
else {
return ans;
}
}
}