29. 两数相除-减少内存占用的二分算法

在官网的解法中,需要使用开辟新的内存空间,仔细分析发现内存空间没必要开辟,具体算法如下:

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;
    }

    int t_TotalCnt_i = 0;
    int t_Multiple_i = 0;
    int t_Data_i = divisor;
    int t_DividendRemainder = 0;
    // 注意溢出
    int i = 0;

    while (t_Data_i >= dividend) {
        t_Multiple_i = (1 << i);
        i++;
        if(t_Data_i > dividend - t_Data_i)
            t_Data_i = (t_Data_i + t_Data_i);
        else
        {
            break;
        }
    }

    t_TotalCnt_i = t_Multiple_i;
    if(t_Multiple_i > 0)
    {
        t_DividendRemainder = dividend - (t_Data_i);
    }
    else
    {
        t_DividendRemainder = dividend;
    }

    while(divisor >= t_DividendRemainder)
    {
        if(t_Data_i >= t_DividendRemainder)
        {
            t_DividendRemainder -= t_Data_i;
            t_TotalCnt_i += t_Multiple_i;
        }

        t_Multiple_i = (t_Multiple_i >> 1);

        t_Data_i = (t_Data_i >> 1);
    }

    return rev ? -t_TotalCnt_i : t_TotalCnt_i;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值