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
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 简述Session 、Cookie、cache 区别
- Android tips(十二)-->Android开发中使用矢量图
- opencv 数据结构之一opencv cvScalar
- leetcode_c++:链表:Reverse Linked Lis(206)
- ubuntu下mysql中my.cnf配置文件参数解释
- 29. Divide Two Integers
- Android签名的过程
- android学习笔记 自定义圆角Button
- hdu 1171
- 在AS中使用lambda表达式
- ios根据内容设置cell的高度
- 史上最全IO框架五(缓冲流)
- HDU 5720
- opacity