剑指offer第一题-整数除法

#include <bits/stdc++.h>

using namespace std;

/**
 * @brief 
 * 输入两个int类型的整数,它们进行除法计算并且返回商,要求不得使用乘号‘*’,
 * 除号‘/’,以及求余符号‘%’。当发生溢出时,返回最大的整数值。
 * 假设除数不为0.例如,输入15和2,输出15/2的结果,7;
 * @return int 
 */

/**
 *思路: 
    第一:与除数比,如果被除数比除数大,除数*2
    第二,继续比,直到被除数小于除数的二倍,记录此刻的倍数
    第三。被除数减去之前的除数累乘的结果,用结果继续重复以上过程
*/
int divideCore(int dividend, int divisor){
    int result = 0;

    // 这里由于把除数与被除数都变为了负数,所以与正数时比较刚好相反
    //大就是小,小就是大
    while (dividend <= divisor){
        
        int value = divisor;
        int quotient = 1;
        // 0xc0000000 为最小int整数值的一半,value 如果小于INT_MIN的一半的话,
        //就说明商最多为1
        // 如果dividend > value + value 就该下一轮了
        while (value >= 0xc0000000  && dividend <= value + value)
        {
            quotient += quotient;
            value += value;
        }

        result += quotient;
        dividend -= value;
    }
    
    return result;
}

int divide(int dividend, int divisor){
    //处理溢出的情况,因为INT最小的值的绝对值要比INT最大值要大1,
    //故如果运算情况如下,会导致溢出
    if(dividend == INT_MIN && divisor == -1){
        return INT_MAX;
    }
    //该变量是标识,除数与被除数的负数数量;
    //为偶,最后结果为正,为奇,最后结果为负
    int negative = 2;
    if(dividend > 0){
        negative --;
        dividend = -dividend;
    }
    if(divisor > 0){
        negative --;
        divisor = -divisor;
    }

    int result = divideCore(dividend, divisor);
    return negative == 1? -result : result;
}
int main(){

    int dividend, divisor;
    cin >> dividend >> divisor;
    int result = divide(dividend, divisor);
    cout << result << endl;
    system("pause");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值