20200328
题目 :两数相除
给定两个整数,被除数dividend
和除数divisor
。将两数相除,要求不使用乘法,除法和mod
运算符。
返回被除数dividend
除以除数divisor
得到的商。
整数除法的结果应当截去(truncate
)其小数部分,例如:truncate(8.345) = 8
以及 truncate(-2.7335) = -2
示例1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
思路 :利用向左移动逼近被除数,全采用负数计算。
code1
class Solution{
public int divide(int dividend, int divisor){
//判断最后结果的正负
boolean sign = (dividend > 0) ^ (divisor > 0);
int result = 0;
if(dividend>0) dividend = -dividend;
if(divisor>0) divisor = -divisor;
while(dividend <= divisor){
int temp_result = -1;
int temp_dividor = divisor;
while(dividend <= (temp_divisor << 1)){
if(temp_divisor <= (Integer.MIN_VALUE >> 1))break;
temp_result = temp_result << 1;
temp_divisor = temp_divisor << 1;
}
dividend = dividend - temp_divisor;
result += temp_result;
}
if(!sign){
if(result <= Integer.MIN_VALUE) return Integer.MAX_VAULE;
result =-result;
}
return result;
}
}
示例:
我们可以以100/3为例
* 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
code2
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 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;
}
}