29. Divide Two Integers

29. Divide Two Integers


Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:

Input: dividend = 10, divisor = 3
Output: 3

Example 2:

Input: dividend = 7, divisor = -3
Output: -2

Note:

Both dividend and divisor will be 32-bit signed integers.

The divisor will never be 0.

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

方法1:

思路:

题目规定不能用整除和取余,那么只能利用不断从被除数中减掉数字。基本做法是对于a/b,找到比a小的b * 2^ n, 减掉之后再继续找到新的n,也就是最后将a标示为以b为系数的power sum of 2。

易错点

  1. 需要处理非常多的edge cases
  2. 中间会有overflow的情况,需要用long来过渡

Complexity

Time complexity: 取决于dividend和divisor的相对大小,technicallyO(1),因为int是有固定范围的
Space complexity: O(1)

class Solution {
public:
    int divide(int dividend, int divisor) {
        // if (dividend == 0) return 0;
        // if (divisor == 0) return INT_MAX;
        if (dividend == INT_MIN) {
            if (divisor == 1) return INT_MIN;
            else if (divisor == -1) return INT_MAX;
        }
        
        int sign = 1;
        if (dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0){
            sign = -1;
        }
        
        int result = 0;
        // 
        //note here the number have to be cast to long first then abs, otherwise cast to overflow
        long dividendl = abs((long) dividend);
        long divisorl = abs((long) divisor);
        
        while (true){
            if (dividendl < divisorl) {
                break;
            }
            int shift = 1;
            while(dividendl >= divisorl << shift){
                shift ++;
            }
            result += 1 << (shift - 1);
            dividendl -= divisorl << (shift - 1);
        }
        return result * sign;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值