import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class Solution {
public int mid(long l,long r){
if((l&1)!=0&&(r&1)!=0){
return (int)((l>>1)+(r>>1)+1);
}
return (int)((l>>1)+(r>>1));
}
/*
* 算出b的次数累计
*/
public List<Integer> calc0(int li,long b){
List<Integer> bb = new ArrayList<>();
bb.add(li);
int temp = 1<<li;
for(int i=li-1;i>=0;i--){
if(temp+(1<<i)<=b){
bb.add(i);
temp += (1<<i);
}
}
return bb;
}
/*
* 计算和mid的乘积
* bb是存放b的2进制累加的次数
*/
public long calc(int mid,List<Integer> bb){
//累加过程中或者左移运算会溢出
BigInteger temp = new BigInteger("0");
for(int i=0;i<bb.size();i++){
BigInteger mid2 = new BigInteger(new Long(mid).toString());
mid2 = mid2.shiftLeft(bb.get(i));
temp = temp.add(mid2);
}
if(temp.compareTo(new BigInteger(new Long(2147483648l).toString()))>0){
return -1;
}
return temp.longValue();
}
public int divide(int dividend, int divisor) {
long a = dividend;
long b = divisor;
if(a==0) return 0;
if(a==b) return 1;
if(b==0) return 2147483647;
if(a==Integer.MIN_VALUE&&b==-1) return Integer.MAX_VALUE;
boolean flag = true;
if(a<0){
a = -a;
flag = !flag;
}
if(b<0){
b = -b;
flag = !flag;
}
if(a<b) return 0;
if(a>b&&a-b<b){
return (int)(flag==true?1:-1);
}
long temp = 1;
long ans = 0;
long l,r,li;
l=r=li=0;
List<Integer> bb = null;
//2147483647 2^31-1
//2147483648 2^31
for(int i=0;i<=31;i++){
if((temp<<i)==b){
ans = a >> i;
return (int)(flag==true?ans:-ans);//2的幂
}
if((temp<<i)<b&&((temp<<(i+1))>b)){
bb=calc0(i,b);
l=a>>(i+1);
r=a>>(i);
break;
}
}
while(l<=r){
if(calc(mid(l,r),bb)==-1){
r=mid(l,r)-1;
}else if(calc(mid(l,r),bb)==a){//mid经过计算等于a
return flag==true?mid(l,r):-mid(l,r);
}else if(calc(mid(l,r),bb)<a){
l=mid(l,r)+1;
}else{
r=mid(l,r)-1;
}
}
//没有整除
return (int)(flag==true?r:-r);
}
}
LeetCode 29 Divide Two Integers
最新推荐文章于 2024-04-18 23:30:00 发布