Divide Two Integers

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

你可能感兴趣的:(C++OJ,LeetCode,TopInterview,Question,LeetCode,Self-Culture,Top,Interview,Questions)