题目: 两数相除

来自智得网
跳转至: 导航、​ 搜索

分析

因为不能使用除法和乘法进行计算,所以考虑使用减法或者加法进行计算。

除法运算的符号位很容易计算,除数和被除数符号相同,则商为整数,否则商是负数,所以符号位的运算可以单独处理,在运算开始之前将除数和被除数都进行求绝对值的操作。

将被除数减去除数,如果得到的差大于等于除数,则将差继续减去除数,直到差小于除数位置结束循环。

上述执行中循环的次数就是商的值。

最后处理符号位,如果除数和被除数有一个负号,则结果为负,否则结果是正值。

穷举法

流程

设置一个计数器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;
        }
    }
}