两个数字相除 不能用 除号等
/** * @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