leetcode: Divide Two Integers

来源:互联网 发布:蒙古帝国和元朝知乎 编辑:程序博客网 时间:2024/06/01 19:53

转载来源: http://www.cnblogs.com/panda_lin/archive/2013/10/30/divide_two_integers.html

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

思路

典型的二分法。以87除4举例, (4 * 2 = 8) => (8 * 2 = 16) => (16 * 2 = 32) => (32 * 2) => 64,因为64 * 2 = 128大于87,现在我们可以确定4 * 16 = 64小于87,那么再处理87 - 64 = 23,23除4的话用上面方法可以得到5,还余3,因为小于4,扔掉,所以最后结果是16 + 5 = 21。因为需要考虑溢出问题,所以先把数字转换为unsigned long long,最后转成int返回。

class Solution {public:    long long internalDivide(unsigned long long dividend, unsigned long long divisor) {        if (dividend < divisor) {            return 0;        }               long long result = 1;        unsigned long long tmp = divisor, left;                while (tmp <= dividend) {            left = dividend - tmp;            tmp <<= 1;                       if (tmp > dividend) {                break;            }            else {                result <<= 1;            }        }               return result + internalDivide(left, divisor);    }        int divide(int dividend, int divisor) {        unsigned long long _dividend = abs((long long)dividend), _divisor = abs((long long)divisor);        bool positive = ((dividend >= 0) && (divisor > 0)) || ((dividend <= 0) && (divisor < 0));         return positive ? internalDivide(_dividend, _divisor) : (-1) * internalDivide(_dividend, _divisor);    }};


0 0
原创粉丝点击