LeetCode #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.

由于不能使用乘法和除法,所以考虑采用位操作,每次向左移动一位相等于扩大两倍,所以可以让除数倍增到最接近被除数,得到一个暂时的商,然后让被除数减去扩大之后的除数,然后循环这个操作,直到被除数小于除数,把每一步的商相加得到最终结果。为了实现这种方法,需要保证除数和被除数都是正数,所以应该先判断商的正负,再对两个数取绝对值。另外对于两个int数相除溢出的情况就是INT_MIN/-1=2^32=INT_MAX+1,所以要单独判断。同时在比较过程中向左移位可能导致溢出,所以对于中间操作的变量都要定义为long long型。

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor==0||(divisor==-1&&dividend==INT_MIN)) return INT_MAX;
        long long m=dividend;
        long long n=divisor;
        bool positive=(dividend>0&&divisor>0)||(dividend<0&&divisor<0);
        m=abs(m);
        n=abs(n);
        long long result=0;
        while(m>=n)
        {
            long long temp_divisor=n;
            long long temp_result=1;
            while(m>=temp_divisor<<1)
            {
                temp_divisor<<=1;
                temp_result<<=1;
            }
            m-=temp_divisor;
            result+=temp_result;
        }
        if(!positive) return -result;
        else return result;
    }
};

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值