leetcode 29:Divide Two Integers
2015-10-15 22:33
429 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目分析:
先说普通处理,想想我们平时的除法是怎么实现的,从最高位向最低位依次向下除,减掉最高位后,递归的求低位的。
再说一下特殊情况,一定要注意边界条件的处理:
1. 除数、被除数为0
2. 除数、被除数可能去负数
3. 最后一个大坑,注意取值范围-2^32-2^32-1,然后也就意味着不能将-2^32转为正值处理,然后我就想着先减掉一部分,不久不会越界,可以转为正值处理了么
具体代码如下:
If it is overflow, return MAX_INT.
题目分析:
先说普通处理,想想我们平时的除法是怎么实现的,从最高位向最低位依次向下除,减掉最高位后,递归的求低位的。
再说一下特殊情况,一定要注意边界条件的处理:
1. 除数、被除数为0
2. 除数、被除数可能去负数
3. 最后一个大坑,注意取值范围-2^32-2^32-1,然后也就意味着不能将-2^32转为正值处理,然后我就想着先减掉一部分,不久不会越界,可以转为正值处理了么
具体代码如下:
public int divide(int dividend, int divisor) { //除数等于0,这个好处理 if(divisor==0) return Integer.MAX_VALUE; //除数特殊值,也好处理 if(divisor==-2147483648) { if(dividend==-2147483648) return 1; else return 0; } //除数特殊值,情况比较复杂 if(dividend==-2147483648) { //除数等于-1,溢出 if(divisor==-1) return Integer.MAX_VALUE; //除数等于1,原值。也可以放在外面统一处理 if(divisor==1) return dividend; //因为绝对值溢出了,不能直接用Math.abs()。所以就想着能从绝对值中先减掉一部分 //没想到特别好的方法,暂时这样,还是觉得很机智啊 else { //除数分正负分开处理 if(divisor>0) { return -1-divide(2147483647-divisor+1,divisor); } else { return 1+divide(2147483647-Math.abs(divisor)+1,Math.abs(divisor)); } } } //处理符号不一致的情况 if((dividend>0&&divisor<0)||(dividend<0&&divisor>0)) return 0-divide(Math.abs(dividend),Math.abs(divisor)); //处理两个都为负的情况 if(dividend<0&&divisor<0) return divide(Math.abs(dividend),Math.abs(divisor)); if(dividend==0) return 0; if(divisor==1) return dividend; if(dividend<divisor) return 0; if(divisor==dividend) return 1; //通过移位操作实现除法,要注意不要溢出。就是从最高位开始往下减,递归实现 int i=1; int len=getlen(divisor); while(dividend>=(divisor<<i)&&i<32-len) { i++; } //递归实现 return (int)Math.pow(2,i-1)+divide(dividend-(divisor<<(i-1)),divisor); } public int getlen(int x) { int len=0; while(x>0) { len++; x=x>>1; } return len; }
相关文章推荐
- 修复BootstrapValidator重复提交的bug
- C语言入门----字符
- Linux正则表达式基础
- AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码
- zabbix监控tomcat(2)
- Watch 应用与 iPhone应用 之间传值
- jQuery购物数量数字加减运算效果
- Dubbo视频教程--基础篇--第06节--Dubbo管理控制台的安装
- 【Android 学习】四大组件(三)——Content Provider
- org.osgi.framework.BundleException: Exception in org.eclipse.core.resources.ResourcesPlugin.start()
- [c++] LeetCode longest substring without repeating characters问题
- 笔记本电脑因安装软件重启导致黑屏?
- Microsoft Dynamics CRM 2013 /2015 配置之 添加 CRM 帐号和新建邮箱
- Microsoft Dynamics CRM 2013 /2015 配置之 添加 CRM 帐号和新建邮箱
- Ubuntu14.04下安装为知笔记
- C++中文件的读写
- Apple Watch开发快速入门教程
- windows phone数据网络开发
- exe文件停止运行的情况
- eclipse 修改控制台 编码