29. Divide Two Integers
2016-07-18 16:35
399 查看
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;
}
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;
}
相关文章推荐
- Java模拟斗地主发牌
- Ubuntu server下搭建Maven私服Nexus
- Fiddler界面详解
- 【C语言入门教程】7.4 共用体
- 滚动条
- [Headset]如何在ADB shell中读取耳机状态和读取ACCDET寄存器
- <java编程思想>(thing in java) 阅读笔记(第七章至第十章)
- Nginx/LVS/HAProxy负载均衡软件的优缺点
- 【C语言入门教程】7.3 结构体指针的定义和引用
- 运行开源项目,报错Error:(48, 37) 错误: -source 1.6 中不支持 diamond 运算符,请使用-source 7或者更高版本已启用diamond运算符
- ubuntu 安装自动解决依赖冲突
- ios 正则表达式之验证手机号、邮箱、身份证、银行卡
- 前端Js跨域方法汇总—剪不断,理还乱,是跨域
- Linux下chkconfig命令详解即添加服务以及两种方式启动关闭系统服务
- poj1651 Multiplication Puzzle 【区间dp】
- Android 屏幕适配方案(二)百分比布局
- java学习总结(16.07.18)时间日期类
- 长图片顶部处理
- Ubuntu配置JDK环境变量
- hdoj 1796 How many integers can you find<容斥原理>