LeetCode——两数相除

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

解题思路:按照计算机实现除法运算来进行求解。这题需要注意的是:只能存储 32 位有符号整数,最小整型数值的相反数会越界,所以需要使用longlong类型。

注意:如果用VS编译调试,会报错error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型;需要改一下实参。

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

 

posted @ 2020-10-20 15:16  CCxiao5  阅读(147)  评论(0编辑  收藏  举报