Divide Two Integers -- LeetCode
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Divide Two Integers -- LeetCode相关的知识,希望对你有一定的参考价值。
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路:
采用位运算。我们先将两个数都看作是正数。
我们将除数左移一位就是将它扩大2倍,左移两位就是扩大4倍,一直左移到再左移一次就会大于被除数为止。
为了记录扩大了多少倍,用一个变量multi = 1也跟着一起左移。
然后用被除数减去扩大后的除数,若结果仍然大于等于原来的除数,则再重复刚才的过程。每次循环中结果都加上multi的值。
这个题中有两种情况可能溢出:
1. 除数是0.
2. 被除数是INT_MIN, 除数是-1。因为INT_MIN(-2147483648, -2^31)的绝对值比INT_MAX(2147483647, 2^31-1)要大一。
1 class Solution {
2 public:
3 int divide(int dividend, int divisor) {
4 if (!divisor || (dividend == INT_MIN && divisor == -1))
5 return INT_MAX;
6 int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
7 long long dvd = (long long)labs(dividend);
8 long long dvs = (long long)labs(divisor);
9 int res = 0;
10 while (dvd >= dvs)
11 {
12 long long tem = dvs, mul = 1;
13 while (dvd >= (tem << 1))
14 {
15 tem <<= 1;
16 mul <<= 1;
17 }
18 dvd -= tem;
19 res += mul;
20 }
21 return sign * res;
22 }
23 };
以上是关于Divide Two Integers -- LeetCode的主要内容,如果未能解决你的问题,请参考以下文章