Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路,就是实现除法操作。
注意点:1 除数为0
2 存在负数且是最小的负数
这两种情况要特殊处理,其实除法就是用加法来实现的。普通的连加是会超时的,可以翻倍加
比如 被除数是100,除数是3,
设置一个sum和一个count
sum=sum+sum;
count=count+count;
sum=3 count=1
sum=6 count=2;
sum=12 count=4;
sum=24 count=8;
sum=48 count=16;
sum=94 count=32;
被除数还剩4
变成了4除以3,count=32+1=33;
得出结果,时间复杂度符合要求。
代码如下(已通过leetcode)
public class Solution {
public int divide(int dividend, int divisor) {
if(divisor==0) return Integer.MAX_VALUE;
if(dividend==0) return 0;
long tempdividend=dividend;
long tempdivisor=divisor;
tempdividend=Math.abs(tempdividend);
tempdivisor=Math.abs(tempdivisor);
if(tempdividend<tempdivisor) return 0;
long tempres=0;
long sum;
long count;
while(tempdividend>=tempdivisor) {
count=1;
sum=tempdivisor;
while(sum+sum<=tempdividend) {
sum=sum+sum;
count=count+count;
}
tempdividend=tempdividend-sum;
tempres=tempres+count;
}
//System.out.println(tempres);
if((dividend>0) ^ (divisor>0)) tempres=-tempres;
if(tempres>Integer.MAX_VALUE || tempres<Integer.MIN_VALUE) return Integer.MAX_VALUE;
else return (int)tempres;
}
}