1 解题思想
就是两个整数相除,不能使用内置的运算,如果溢出那么久返回最大的整数
2 原题
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目需要拆解成一个基数为2的。请看我代码里面的那个连接
今天好忙来不及仔细说了,见谅
3 AC解
public class Solution {
/**
* http://www.tuicool.com/articles/FNrUvyE
* 具体解析请看上面那个
* 可以拆解成2为基数的哪一个,值得学习!
* */
public int divide(int dividend, int divisor) {
if(divisor==0)
return Integer.MAX_VALUE;
//注意这里做强制转换,给定了abs时调用的仍然是int,遇到负无穷会溢出,所以提前转换成long,注意括号内外都要转
long a=Math.abs(dividend+0l),b=Math.abs(divisor+0l);
// System.out.println(a+" "+b);
if(b>a)
return 0;
long count=0,times=0;
while(b<<1 <= a){
b<<=1;
times++;
}
while(times>=0){
// System.out.println(a+" "+b+" "+count);
if(a>=b){
count+=1<<times;
a-=b;
}
b>>=1;
times--;
}
if((dividend^divisor)>>>31==1){
return (int)-count;
}
else{
//负数的绝对值比正数多一位,特别小心!!!
int tmp=(int)count;
if(tmp<0)
return Integer.MAX_VALUE;
else return tmp;
}
}
}