1. 程式人生 > >LeetCode 29 — Divide Two Integers(兩數相除)

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