剑指 Offer II 001. 整数除法

题目:

思路:

【1】首先是要明确溢出的情况,由于负数的数值是比正数多一位的,所以会存在Integer.MIN_VALUE/-1,这样就会大于Integer.MAX_VALUE

【2】基于暴力破解的思想,可以采用减法替代除法,这样是可以完成题目的要求的,但是还可以采用倍增的方式来加大减数的大小,如-16相当于4次的-4,相当于8次的-2,如果一个数大于16,采用这种方式会更加的快,运算次数也会更少。

代码展示:

class Solution {
    public int divide(int a, int b) {
        //边界条件,溢出
        if(a == Integer.MIN_VALUE && b == -1){
            return Integer.MAX_VALUE;
        }
        //记录符号
        int sign = (a^b)<0?-1:1;
        int res = 0;

        //转为负数,因为负数比正数多1
        if (a>0){
            a = -a;
        }
        if (b>0){
            b = -b;
        }

        int value = b;
        int k = 1;
        while(a <= b) {
            //普通减法很慢,采用2倍相减
            value = b;
            k = 1;
            //负数判断;且a < value + value 可能溢出,等式变换
            while(a - value < value) {
                value = value << 1;
                k = k << 1;
            }
            a -= value;
            res += k;
        }

        return sign == 1 ? res : -res;
    }
}

 

posted @ 2023-01-30 14:37  忧愁的chafry  阅读(13)  评论(0编辑  收藏  举报