两个数字相除 不能用 除号等
/**
* @Title: temp.java
* @Package
* @Description: TODO
* @author nutc
* @date 2013-9-7 下午1:42:09
* @version V1.0
*/
public class temp {
public static void main(String asrgs[]){
temp t = new temp();
System.out.println(t.divide(-2147483648, 2));
}
public int divide(int dividend1, int divisor1) {
//考虑1)正负号 2)溢出--long处理 记得在math.abs里就要long 不然 int 里的MIN_VALUE会溢出的!
if(divisor1 ==0) return -1; //除数为0的时候应该怎么处理?
if(divisor1 == 1) return dividend1;
if(dividend1 == 0) return 0;
boolean ifn = false;
if(dividend1<0 && divisor1>0 || dividend1>0&&divisor1<0){
ifn = true;
dividend1 = -dividend1;
}
long dividend = Math.abs((long)dividend1); //最重要的环节!!最大的会造成溢出!! 因为正数比负数少一个啊啊啊啊
long divisor = Math .abs((long)divisor1);
int i = 1,j=1;
while(i*divisor>0 && i*divisor<dividend ){
j = i;
i+=i;
}
// System.out.println("i="+i+" "+i*divisor);
int temp = j;
while(i*divisor<0 || i*divisor<dividend){
// if(i*divisor>dividend) break;
if(i*divisor<0)
i -= temp;
temp >>=1;
i += temp;
}
while(j<=i){
int mid = j+((i-j)>>1); //左右移动的优先级 低于 常见操作符!!
// System.out.println(j+" "+mid+" "+i);
if(mid*divisor==dividend|| mid*divisor<dividend && (mid+1)*divisor>dividend){
if(!ifn)
return mid;
else
return -mid;
}
else if(mid*divisor>dividend){
i = mid-1;
}else{
j = mid+1;
}
}
return 0;
}
}
别人写的比较值得参考
/*
* Divide two integers without using multiplication, division and mod operator.
*/
public int divide(int dividend, int divisor) {
if (divisor == 0) throw new IllegalArgumentException("divisor cannot be 0");
if (dividend == 0) return 0;
boolean neg = (dividend > 0 != divisor > 0);
long dend = dividend;
long dsor = divisor;
dend = Math.abs(dend);
dsor = Math.abs(dsor);
if (dsor == 1)
return neg ? new Long(-dend).intValue() : new Long(dend).intValue());
if (dend == dsor)
return neg ? -1 : 1;
int quotient = 0;
while (dend >= dsor){
long tmp = dsor;
int result = 1;
while (dend >= (tmp + tmp)){
tmp <= 1;
result <= 1;
}
quotient += result;
dend -= tmp;
}
return neg ? -quotient : quotient;
}
http://gist.github.com/bittib/5734695