29. Divide Two Integers

public class Solution {
    public int getRes(long a,long b)
    {
        if(a==0)
            return 0;
        if(a<b)
            return 0;

        int res=0;
        long times=1;
        long remain=a;
        long var=b;
        while(remain>=var)
        {
            remain-=var;
            res+=times;
            var*=2;
            times*=2;
        }
        if(remain>0)
        {
            res+=getRes(remain,b);
        }
        return res;
        
    }
    
    public int divide(int dividend, int divisor) {
        // 先将被除数和除数都调整为正数
        int MAX_INT=2147483647;
        
        // 先用两个long类型的数据来存放dividend和divisor,否则会造成abs(-2147483648)溢出
        // 由于long java.lang.Math.abs(long a) 函数的输入参数是long类型的时候
        // 其返回值才是long类型,所以,首先将int类型的dividend和divisor转换为long类型的x和y
        // 之后再进行long类型的abs操作。
        
        // 如果不进行这一步的话,那么直接调用
        // long a=Math.abs(dividend)  
        // 此时是执行的函数 int java.lang.Math.abs(int a)
        // 如果 a=-2147483648,则得到的结果应该是-2147483648这个数的绝对值:2147483648
        // 由于 int 存放正数 2147483648 会溢出,并变化为 -2147483648。
        // 所以此时得到的long变量的值为-2147483648
        // 即,long num=Math.abs(-2147483648),这个num的类型为long,值为-2147483648,原因是发生了溢出
        
        long x=(long)dividend;
        long y=(long)divisor;
        long a=Math.abs(x);
        long b=Math.abs(y);
        int res=getRes(a,b);
        //同号
        if((dividend<0&&divisor<0)||(dividend>0&&divisor>0))
        {
            if(res<0)
                return MAX_INT;
            else
                return res;
        }
        //异号
        else
        {
            return 0-res;
        }
    }
}
原文地址:https://www.cnblogs.com/aguai1992/p/5505753.html