LeetCode——兩數相除
阿新 • • 發佈:2020-10-20
題目地址: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; } };