【LeetCode练习】[中等]29. 两数相除
29. 两数相除
算法思想:位运算
题目:
java代码
/**
* 2^n是1,2,4,8...2^31这种数,当n为31时,这个数特别大,100/2^n是一个很小的数,肯定是小于3的,所以循环下来,
* 当n=5时,100/32=3, 刚好是大于等于3的,这时我们将100-32*3=4,也就是减去了32个3,接下来我们再处理4,同样手法可以再减去一个3
*
* 所以一共是减去了33个3,所以商就是33
*/
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
boolean negative;
negative = (dividend ^ divisor) < 0;//用异或来计算是否符号相异
long t = Math.abs((long) dividend);//用long,否则MIN_VAlUE取反,要溢出
long d = Math.abs((long) divisor);
int result = 0;
for (int i = 31; i >= 0; i--) {
if ((t >> i) >= d) {//找出足够大的数2^n*divisor
result += 1 << i;//将结果加上2^n
t -= d << i;//将被除数减去2^n*divisor
}
}
return negative ? -result : result;//符号相异取反
}
}