题目地址: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; } };