29. Divide Two Integers

来源:互联网 发布:神奈川有什么大学知乎 编辑:程序博客网 时间:2024/05/17 23:22

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.


基本思想用例子说明,例如327/6=54,首先找出327最多够减去6的左移多少位,6<<5=192,那就用327-192=135,

最多能够减去6的左移5位,剩下135,商就加上1<<5=32,然后135再做迭代处理,6<<4=96,135-96=39,商+=(1<<4=16),

6<<2=24,39-24=15,商+=(1<<2=4),6<<1=12,15-12=3,商+=(1<<1=2),剩下的3不够减去6的左移任何一位,停止了。

商的符号可以通过将被除数和除数的符号位异或得到,然后化为无符号处理,最后添上符号。

整数最小-2148473648和最大2147483647数值不一样,防止溢出需要特别处理,为了简便就直接上long吧,

就是因为坚持使用int,代码才把简单的逻辑都搞乱了。。。QAQ


public static int divide(int dividend, int divisor){if(dividend==0)return 0;if(dividend==Integer.MIN_VALUE&&divisor==-1)return Integer.MAX_VALUE;int retnegative=(dividend>>31)^(divisor>>31);int add=0;if((divisor>>31&0x1)==1)divisor=-divisor;if(dividend==Integer.MIN_VALUE){dividend=Integer.MAX_VALUE-divisor+1;add++;}if((dividend>>31&0x1)==1)dividend=-dividend;if(divisor>=Integer.MAX_VALUE>>1){int ret= dividend-divisor>=0?1:0;if(ret>0){dividend-=divisor;dividend+=add;ret=dividend-divisor>=0?ret+1:ret;}ret+=add;if(retnegative!=0)ret=-ret;return ret;}int ret=0;int i=0;for(;(divisor<<i)<(Integer.MAX_VALUE>>1);i++)if(dividend-(divisor<<i)<0)break;if(i==0)ret=0;else {ret+=1<<(i-1);int remain=dividend-=divisor<<(i-1);ret+=divide(remain, divisor);}ret+=add;if(retnegative!=0)ret=-ret;return ret;}


0 0