1. 程式人生 > 實用技巧 >LeetCode——兩數相除

LeetCode——兩數相除

題目地址:https://leetcode-cn.com/problems/divide-two-integers/

解題思路:按照計算機實現除法運算來進行求解。這題需要注意的是:只能儲存 32 位有符號整數,最小整型數值的相反數會越界,所以需要使用longlong型別。

注意:如果用VS編譯除錯,會報錯errorC4146:一元負運算子應用於無符號型別,結果仍為無符號型別;需要改一下實參。

#define int_num (-2147483647-1)
int main(int argc, const char * argv[]) {
    Solution S;
    cout << S.divide(int_num, -1109186033
); return 0; }

class Solution {
private:
    long long getBiteNum(long long k)
    {
        long long num = 1;
        k = (long long)abs(k);
        while (k = k >> 1)
            num++;
        return num;
    }
public:
    int divide(long long dividend, long long divisor) {
        if
(divisor == 0) return 0; if (divisor == 1) return dividend; if (divisor == -1) if (dividend > INT_MIN) return -dividend; else return INT_MAX; int flag = 1; if (dividend < 0) { dividend
= -dividend; flag = -flag; } if (divisor < 0) { divisor = -divisor; flag = -flag; } long biteNum = getBiteNum(dividend);//獲取位數 long shang, yushu, offset; shang = 0; yushu = 0; while (biteNum--) { unsigned int b = 1 << biteNum;值 offset = (b == (b & dividend)) ? 1 : 0;//獲取相應位置的值 yushu = (yushu << 1) + offset;//餘數左移1位加上offset if (yushu >= divisor) { shang += (int)pow(2.0, biteNum); yushu -= divisor; } } return shang * flag; } };