class Solution {
public int divide(int dividend, int divisor) {
if(dividend==-2147483648&&divisor==-1){
return 2147483647;
}
if(dividend==-2147483648&&divisor==1){
return -2147483648;
}
long dividendzhen=dividend,divisorzhen=divisor;
long fuhao=1;
if((dividend<0&&divisor<0)||(dividend>0&&divisor>0)){
fuhao=1;
}else{
fuhao=-1;
}
if(dividend<0){
dividendzhen=-1*(long)dividend;
}
if(divisor<0){
divisorzhen=-1*(long)divisor;
}
long ans=0;
while(dividendzhen>=divisorzhen){
dividendzhen-=divisorzhen;
++ans;
}
return (int)(ans*fuhao);
}
}
自己先写的巨丑的代码。。。且超时。看题解用二分法的思想,dividend每次减去2^ n个divisor(尽可能多),同时reslut每次加2^n。而且当最小值时可能存在越界问题,因此都用负数进行计算。只能看题解了。。。
class Solution {
public int divide(int dividend, int divisor) {
if(dividend==Integer.MIN_VALUE&&divisor==-1)
return Integer.MAX_VALUE;
boolean k=(dividend>0&&divisor>0)||(dividend<0&&divisor<0);
int result=0;
dividend=-Math.abs(dividend); //当dividend为最小负数时,再abs的结果不会越界,再加负号给回dividend也就不会越界了
divisor=-Math.abs(divisor);
while(dividend<=divisor) {
int temp=divisor;
int c=1;
while(dividend-temp<=temp) {
temp=temp<<1;
c=c<<1;
}
dividend-=temp;
result+=c;
}
return k?result:-result;
}
}