给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。
注意:
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1
示例1:
输入:a = 15, b = 2
输出:7
解释:15/2 = truncate(7.5) = 7。
class Solution {
public int divide(int a, int b) {
//先考虑特殊情况
//溢出情况
if(a==Integer.MIN_VALUE&&b==-1){
return Integer.MAX_VALUE;
}
if(b==Integer.MIN_VALUE){
if(a==Integer.MIN_VALUE)return 1;
return 0;
}
int sign=1;
//都转换为小数,避免溢出
if(a>0){
sign=-sign;
a=-a;
}
if(b>0){
sign=-sign;
b=-b;
}
return sign*getAns(a,b);
}
public int getAns(int a,int b){
if(a>b)return 0;
//暂存b
int tmp=b;
//除的结果
int ans1=1;
//除数的倍数
int ans2=1;
a-=tmp;
//a足够减去两倍的tmp
while(a-tmp<tmp){
//倍数乘以2
ans2*=2;
ans1+=ans2;
tmp*=2;
a-=tmp;
}
if(a-tmp==tmp){
return ans1+ans2*2;
}else{
return ans1+getAns(a,b);
}
}
}
思路:除数每次乘以2,被除数减去除数,如果不够减,用减的结果再次从头减初始除数。
例如:
9/2
9-2=7 ans=1
7-4=3 ans=1+2
3-8<0
3递归地除以2
3-2=1 ans=1+2+1
1-4<0
1-2<0
把所有减的数加起来就是答案。