LeetCode 29 — Divide Two Integers(两数相除)

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.

翻译
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

分析
一次性减去除数的2的最大次方,直到无法减去,减去的个数就是结果。

c++实现

class Solution {
public:
    const int M = (int)(pow(2,31)-1), m = -M-1;
    int divide(int dividend, int divisor) {
        if (dividend == m && divisor == -1) return M;
        int f = 0, ans = 0, T = divisor, t;
        if (dividend > 0) dividend = -dividend, f ^= 1;
        if (divisor > 0) divisor = -divisor, f ^= 1;
        while (divisor >= dividend)
        {
            t = -1, T = divisor;
            while ((T << 1)<0 && (T << 1) >= dividend) T <<= 1, t <<= 1;
            if (f) ans += t;
            else ans -= t;
            dividend -= T;
        }
        return ans;
    }
};

你可能感兴趣的:(算法笔记)