leetcode: Divide Two Integers

转载来源: 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);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值