29. 两数相除

题目链接:29. 两数相除 - 力扣(LeetCode)

 

 

 

 

 

 

 

 

 

解析:

快速乘 + 二分,快速乘和快速幂一个板子,只不过乘法变加法,最后看了眼题目解析,我觉得有个二分的地方说的很好,摘抄下来,供思考

 

long l = 0, r = 1000009;
while (l < r) {
    long mid = l + r + 1 >> 1;
    if (check(mid)) {
        l = mid;
    } else {
        r = mid - 1;
    }
}

  

为啥修改左边指针 l 的时候要进行 +1 操作?
「模板一」的 +1 操作主要是为了避免发生「死循环」,因为 >> 和 直接使用 / 一样,都属于「下取整」操作。

考虑 l = 0, r = 1 的简单情况,如果不 +1 的话,l + r >> 1 等于 0 + 1 / 2,l 仍然是 0,陷入死循环。

 

class Solution {
public:
    long mul(long a, long b) {
        long ret = 0;
        while(b) {
            if (b & 1) ret += a;
            a += a;
            b >>= 1;
        }
        return ret;
    }


    int divide(int dividend, int divisor) {
        int min_inf = -2147483648, max_inf = 2147483647;


        int flag = 1;
        if (dividend < 0) flag *= -1;
        if (divisor < 0) flag *= -1;
        if (abs((long)divisor) == 1 && flag > 0 && dividend == min_inf) return max_inf;
        long target = abs((long)dividend);
        long dor = abs((long)divisor);

        long x = 0, y = target;
        while(x < y) {
            long mid = (x + y + 1) / 2;
            if (mul(mid, dor) <= target) x = mid;
            else y = mid - 1;
        }

        return flag * x;
    }
};

 

posted @ 2025-08-08 20:50  WTSRUVF  阅读(7)  评论(0)    收藏  举报