m0_61574664 2022-01-05 03:32 采纳率: 87.1%
浏览 117
已结题

两数相除,我有几个问题,希望能回答详细一点

class Solution {
public:
int divide(int dividend, int divisor) {
// 考虑被除数为最小值的情况
if (dividend == INT_MIN) {
if (divisor == 1) {
return INT_MIN;
}
if (divisor == -1) {
return INT_MAX;
}
}
// 考虑除数为最小值的情况
if (divisor == INT_MIN) {
return dividend == INT_MIN ? 1 : 0;
}
// 考虑被除数为 0 的情况
if (dividend == 0) {
return 0;
}

    // 一般情况,使用二分查找
    // 将所有的正数取相反数,这样就只需要考虑一种情况
    bool rev = false;
    if (dividend > 0) {
        dividend = -dividend;
        rev = !rev;
    }
    if (divisor > 0) {
        divisor = -divisor;
        rev = !rev;
    }

    // 快速乘
    auto quickAdd = [](int y, int z, int x) {
        // x 和 y 是负数,z 是正数
        // 需要判断 z * y >= x 是否成立
        int result = 0, add = y;
        while (z) {
            if (z & 1) {
                // 需要保证 result + add >= x
                if (result < x - add) {
                    return false;
                }
                result += add;
            }
            if (z != 1) {
                // 需要保证 add + add >= x
                if (add < x - add) {
                    return false;
                }
                add += add;
            }
            // 不能使用除法
            z >>= 1;
        }
        return true;
    };
    
    int left = 1, right = INT_MAX, ans = 0;
    while (left <= right) {
        // 注意溢出,并且不能使用除法
        int mid = left + ((right - left) >> 1);
        bool check = quickAdd(divisor, mid, dividend);
        if (check) {
            ans = mid;
            // 注意溢出
            if (mid == INT_MAX) {
                break;
            }
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }

    return rev ? -ans : ans;
}

};
我有几个问题,来个认真负责的大佬,这是力扣原题,这是官方解答
问:if (z & 1)这是什么意思呢,运用了什么运算呢,希望讲得详细一点
问:if (result < x - add) { return false; }但是他的初始值int result = 0难道不会一开始就return false吗,这个result有什么用呢
问:z >>= 1;这是什么意思呢,与z >> 1;有什么区别呢
问:int left = 1, right = INT_MAX, ans = 0;
while (left <= right) {
// 注意溢出,并且不能使用除法
int mid = left + ((right - left) >> 1);
bool check = quickAdd(divisor, mid, dividend);
if (check) {
ans = mid;
// 注意溢出
if (mid == INT_MAX) {
break;
}
left = mid + 1;
}
else {
right = mid - 1;
}
}

    return rev ? -ans : ans;
}

这段有什么意义呢,left为什么是1而不是int_min呢,希望来个负责任的大佬对这一段仔细讲解一下

  • 写回答

2条回答 默认 最新

  • Admini$trat0r .net领域新星创作者 2022-01-05 08:03
    关注

    1.(z & 1) 按位与 比如z=5 就是二进制的101 与 001 按位与 就是001 全1为1 没毛病。
    2.result < x - add 不会直接 因为条件是 x-add 第一次为0 第二次加上add 所以逻辑没毛病。
    3.z >>= 1 相当于 z=z>>1 位运算 右移1位 比如z=5 101 右移之后 010 也就是变成了2 相当于5 / 2 没毛病。
    4.二分基本操作

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题