LeetCode 29 Divide Two Integers 除法的原理
2015-08-22 22:19
597 查看
Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
解题思路:这道题非常有意思,让我们利用基本的运算符号实现除法运算法则,由于基础数学知识的空白,在我原来学习除法的时候,并没有深入除法的本质,在过去我的眼里,除法运算就是个机械的算法,一个封装了的实现。现在,由于这道编程题让我深刻反思了除法原理。算法是这样的,让除数右移(二进制位的右移操作)使得除数扩大接近被除数,直到除数增大有余数存在,让被除数减去这个增大后的除数,让余数去进行判断。也要考虑最小整数的越界情况,比如-2147483648取相反数后结果为-2147483648。因为最大整数为2147483647。因此,在这里,遇到最大负数和-1的时候,返回结果直接选择最大整数即可。
代码如下:
public int divide(int dividend,int divisor){
int tag =1;//整数
long a = dividend;
long b = divisor;
if(divisor == 1) return dividend;
if(divisor == -1) {
if(dividend==Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}
return -dividend;
}
if(dividend>=0&&divisor>=0||dividend<=0&&divisor<=0){
tag=1;
}else{
tag=-1;
}
a = Math.abs((long)a);
b = Math.abs((long)b);
if(a<b){
return 0;
}
int re=0;
while(a>=b){
int temp =1;
long bt= b;
while(a>=bt<<1){
bt=bt<<1;
temp = temp<<1;
}
re+=temp;
a-=bt;
}
return re*tag;
}
整个实现是在参考http://www.cnblogs.com/reynold-lei/archive/2013/10/15/3369494.html下实现的。
相关文章推荐
- R语言_非参数检验
- IOS弹出视图preferredContentSize
- ACM学习历程—HDU5418 Victor and World(动态规划 && 状压)
- 启动tomcat时出现The specified JRE installation does not exist 如何解决?
- 面向对象设计模拟简单ATM系统
- CCActionGird源码分析
- 第91讲:Akka第一个案例动手实战架构设计
- MySql 事务+异常处理+异常抛出
- 个人acm模版
- 基于Spring提供支持不同设备的页面
- HDU5418——TSP变形——Victor and World
- 基于Spring提供支持不同设备的页面
- 基于Spring提供支持不同设备的页面
- 基于Spring提供支持不同设备的页面
- 黑马程序员12交通信号灯系统
- Effective Objective-C 2.0学习笔记(部分)
- MSP430G2553与MSP430F5336系列单片机总结[3]——看门狗定时器
- 【好玩的前端知识】 Kube
- 例说linux内核与应用数据通信系列
- 关于类的组合和继承