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; } } }