Divide Two Integers

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:
Input: dividend = 10, divisor = 3
Output: 3

Example 2:
Input: dividend = 7, divisor = -3
Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

给定两个整数除数和除数,除以两个整数而不使用乘法,除法和换算运算符。

将除数除以除数后返回商。

整数除法应截断为零。

注意

  • 被除数和除数都是32位有符号整数。
  • 除数永远不会为0。
  • 假设我们正在处理一个只能在32位有符号整数范围内存储整数的环境:[ - 231,231 - 1]。 出于此问题的目的,假设当除法结果溢出时,函数返回231 - 1。

2,题目思路

对于这道题,要求计算两个数字的商。

在计算两个数字的商时,关键在于:
使得被除数减去除数、且不让被除数变为0的次数。

举个例子,假设被除数为15,除数为4,总的次数为m

  1. 15 - 4 = 11 > 0,将除数扩大为原来的两倍,m = 1
  2. 15 - 4*2 = 7 > 0,将除数扩大为原来的两倍, m = 2
  3. 15 - 422 = -1 < 0,不可行,此时,我们得到新的被除数为:15 - 4*2 = 7,除数为4,因为被除数当前还大于除数,因此还需要继续进行;
  4. 7 - 4 = 3 > 0,将除数扩大为原来的两倍,m = 3
  5. 此时,被除数为7,除数为4*2 = 8,被除数小于除数,自然结束了。

因为m = 3,我们有:15 = 3*4 + 3
即,15/4 = 3

同时,需要注意的是,当INT_MIN除以-1时,会造成溢出,因此,当被除数和除数分别是上述二者时,直接返回INT_MAX即可。

3,代码实现

static auto speedup = [](){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend == INT_MIN && divisor == -1)
            return INT_MAX; //对移除的情况进行判断
        
        int sign = dividend>0 ^ divisor>0 ? -1 : 1;
        long long dvd = labs(dividend);  //被除数
        long long dvs = labs(divisor);  //除数
        long long res = 0;
        
        //当被除数大于等于除数时
        while(dvd >= dvs){
            long tmp = dvs, m = 1;
            while((tmp<<1) <= dvd){ //当前够除
                tmp <<= 1;   //除数×2
                m <<= 1;     //除数构成个数×2
            }
            dvd -= tmp; //剩余的被除数
            res += m;
        }
        return sign*res;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值