现在的位置: 首页 > 综合 > 正文

除数

2018年09月30日 ⁄ 综合 ⁄ 共 1727字 ⁄ 字号 评论关闭

两个数字相除 不能用 除号等

/** 
 * @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

抱歉!评论已关闭.