29. 两数相除
给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
返回被除数 dividend 除以除数 divisor 得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。
https://leetcode.cn/problems/divide-two-integers/description/
方法二、根据递归法总结进行化简
首先根据方法一里面的描述,我们已经理解 并得出了这个递归的过程,所以我们来进一步优化迭代的运算,
为了节省函数调用次数,用循环来代替递归的过程即可
我们先找到最大的那个可以减去的数字,
然后再进行右移找尽可能大的那个可以减去的数字
有一个细节是要把整数变成负数后再进行运算,因为补码的表示范围中,负数比正数多出来一位,
因此用减法运算可以减少边界判断的次数。
我在代码里使用了移位,
maxSub <<= 1; // 被除数翻倍
// 也可以写成 maxSub+=maxSub;
上下两种写法效果和结果完全一样,
移位据说更省,
但是我想现代的编译器,应该会自己优化这样的运算。
if (ratio == 0) {
ratio = 1;
}
这里的判断不可以省略,
因为32/2 = (32-16-8-4-2-2)/2 +8+4+2+1+1= 8+4+2+1+1 = 16
否则会输出15,答案错误

class Solution {
public:
int divide(int dividend, int divisor) {
// 处理边界情况
if (dividend == INT_MIN && divisor == 1)
return INT_MIN;


1805

被折叠的 条评论
为什么被折叠?



