题目要求:
给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。
注意:
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231-1
分析思路:题目要求不能使用乘号和除号进行运算,可以利用减法实现除法。
考虑数据非常大,利用被除数大于除数时,比较是否大于其2倍,继续比较是否大于其4倍、8倍等。如果被除数最多大于除数的2k倍,那么被除数减去除数的2k倍。 时间复杂度为O(logn);
具体实现 代码如下:
public static int divide(int a, int b){
if(a==Integer.MIN_VALUE && b==-1)
return Integer.MAX_VALUE; //特殊情况
int mark=2; //先将数据全部转换为负数,然后再根据符号判断结果
if(a>0){
mark--;
a=-a;
}
if(b>0){
mark--;
b=-b;
}
int res=divideCore(a,b);
return (mark&1)==1? -res:res;
}
public static int divideCore(int a,int b){
int res=0;
while(a<=b){
int c=b;
int d=1;
while(c>=(Integer.MIN_VALUE/2)&&c+c>=a){ //避免溢出 当c<Integer.MIN_VALUE c+c就会溢出
c+=c;
d+=d;
}
a-=c;
res+=d;
}
return res;
}