题目:Divide Two Integers
难度:medium
问题描述:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
解题思路:问题的难点在于,一是不能用乘号,除号和取模,那么做除法还能用什么~,一个是不停的减除数,但是太慢,另一个方法就是使用位移<<。
难点二在于溢出,我们可以用long来进行运算,得出结果后与Integer.Max_Value比较,若是超出就返回Integer.Max_Value。
具体代码十分简单,我分正负简化了判断,不过增长了代码量:
public class Solution {
public static int divide(int beichushu, int chushu) {
long dividend=beichushu;
long divisor=chushu;
if(divisor==0||dividend==0) return 0;
long i=0;
long temp=0;
long yushu=0;
if((divisor*dividend)>0){
divisor=Math.abs(divisor);
dividend=Math.abs(dividend);
while(true){
if(divisor>dividend) {
yushu=dividend;
// System.out.println("余数="+yushu);
break;
}
if(divisor==dividend) {
temp++;
yushu=0;
// System.out.println("余数="+yushu);
break;
}
if((divisor<=dividend){
temp=temp+(1<<(i-1));
// System.out.println("temp="+temp);
// System.out.println("i="+i+"减去"+divisor*(1<<(i-1)));
dividend-=divisor*(1<<(i-1));
// System.out.println("被除数="+dividend);
i=0;
}else{
i++;
}
}
}
else {
divisor=Math.abs(divisor);
dividend=Math.abs(dividend);
while(true){
if(divisor>dividend) {
yushu=dividend;
// System.out.println("余数="+yushu);
break;
}
if(divisor==dividend) {
temp++;
yushu=0;
// System.out.println("余数="+yushu);
break;
}
if((divisor<=dividend){
temp=temp+(1<<(i-1));
// System.out.println("temp="+temp);
// System.out.println("i="+i+"减去"+divisor*(1<<(i-1)));
dividend-=divisor*(1<<(i-1));
// System.out.println("被除数="+dividend);
i=0;
}else{
i++;
}
}
temp=-temp;
}
if(temp>Integer.MAX_VALUE||temp