29. Divide Two Integers

原创 2015年07月10日 18:27:08

要正确地解答这道题目,需要注意三点。第一点,题目要求不能够使用乘法、除法和取模运算,所以我们只能够使用加减法和位移运算。第二点,任何一个整数num,都能表示为如下形式:num=c+a0*d*2^0+a1*d*2^1+a2*d*2^2+...+an*d*2^n,其中c在这里>=0并且<d,ai为0或者1,d为>=1的整数。第三点,要注意一些边界情况,比如dividend为INT_MIN并且divisor为-1。算法思想是,我们找出pDivisor能够左移的最大次数numShift,使得pDivisor<<numShift刚刚大于pDividend,这时numShift类似于第二点中的n+1,然后我们记录下pDivisor在这部分获取到的倍数1<<(numShift-1),并将pDividend减去pDivisor<<(numShift-1),并开始下一循环。详细代码如下:

class Solution {
public:
    int divide(int dividend, int divisor) {
        // 处理特殊情况
        if (divisor==0) {
            return INT_MAX;
        }
        if (divisor==-1 && dividend==INT_MIN) {
            return INT_MAX;
        }
        
        // 得到非负数
        long long pDividend = abs((long long)dividend); // 一定要强制类型转化,否则abs(INT_MIN)的结果会非常奇怪
        long long pDivisor = abs((long long)divisor);
        int result = 0;
        while (pDividend>=pDivisor) { // 要写等号
            // 计算左移多少次可以使pDivisor<<numShift刚刚大于pDividend
            int numShift = 0;
            while (pDividend>=(pDivisor<<numShift)) {
                numShift++;
            }
            result += 1<<(numShift-1);
            pDividend -= pDivisor<<(numShift-1);
        }
        if ((divisor>0 && dividend>0) || (divisor<0 && dividend<0)) {
            return result;
        } else {
            return -result;
        }
        
    }
};


[LeetCode-29] Divide Two Integers(两个整数相除,不用乘除取余算术符)

Divide two integers without using multiplication, division and mod operator.If it is overflow, retur...

29. Divide Two Integers

两个整数相除

LeetCode 29 Divide Two Integers (C,C++,Java,Python)

Problem: Divide two integers without using multiplication, division and mod operator. If it ...

LeetCode(29)Divide Two Integers

题目内容 Divide two integers without using multiplication, division and mod operator. 题目分析 最容易的想到的办法,是把...

[LeetCode]29.Divide Two Integers

【题目】 Divide two integers without using multiplication, division and mod operator. If it is overfl...

leetCode 29.Divide Two Integers (两整数相除) 解题思路和方法

Divide Two Integers  Divide two integers without using multiplication, division and mod operato...

[LeetCode29]Divide Two Integers

Divide two integers without using multiplication, division and mod operator. Analysis:
  • sbitswc
  • sbitswc
  • 2014年06月12日 01:32
  • 7183

LeetCode 29. Divide Two Integers 二进制分解

题目Divide two integers without using multiplication, division and mod operator.If it is overflow, ret...

LeetCode29 - divide two Integers

LeetCode29 - Divide Two Integer

LeetCode#29. Divide Two Integers

两个整数相除(不能使用乘法、除法和取模运算)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:29. Divide Two Integers
举报原因:
原因补充:

(最多只允许输入30个字)