题目: 两数相除
来自智得网
分析
因为不能使用除法和乘法进行计算,所以考虑使用减法或者加法进行计算。
除法运算的符号位很容易计算,除数和被除数符号相同,则商为整数,否则商是负数,所以符号位的运算可以单独处理,在运算开始之前将除数和被除数都进行求绝对值的操作。
将被除数减去除数,如果得到的差大于等于除数,则将差继续减去除数,直到差小于除数位置结束循环。
上述执行中循环的次数就是商的值。
最后处理符号位,如果除数和被除数有一个负号,则结果为负,否则结果是正值。
穷举法
流程
设置一个计数器counter。
将 dividend 减去 divisor,如果得出的差值大于divisor, 则将差值赋给 dividend ,counter的值进行加一,循环该过程,直到差值小于 dividend,循环结束。
输出计数器的值counter就是两数相除的结果。
二分法
上述穷举法每次都是减去 divisor 的值,如果 dividend 的值远大于 divisor,循环次数会比较多。
可以在循环过程中逐渐增加 divisor 的值,例如每多一次循环将 divisor 的值乘以2,而且还可以进行的优化是每次不需要实际执行减法运算,只需要比较被除数和除数的值即可。
题解
public class Solution {
public int solute(int dividend, int divisor){
if(dividend == divisor) return 1;
if(divisor == 1) return dividend;
if(dividend == Integer.MAX_VALUE && divisor == -1) {
return Integer.MIN_VALUE;
}
if(divisor == Integer.MIN_VALUE && dividend == Integer.MIN_VALUE) {
return 1;
} else if(dividend == Integer.MIN_VALUE){
return 0;
}
boolean sign = false;
if(dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0 )
{
sign = true;
}
int result_1 = 0;
if(dividend == Integer.MIN_VALUE)
{
if(divisor > 0)
dividend = dividend + divisor;
else dividend = dividend - divisor;
result_1++;
}
dividend = Math.abs(dividend);
divisor = Math.abs(divisor);
while(dividend>=divisor)
{
long temp=divisor,res=1;
while(dividend>=(temp<<1))
{
res<<=1;
temp<<=1;
}
result_1+=res;
dividend-=temp;
}
if (sign == true) {
return result_1;
} else {
return -result_1;
}
}
}