29. Divide Two Integers [两数相除]

描述

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商

例子
在这里插入图片描述
思路

  • 使用异或判断符号

a^a=0 True^True==0

  • 使用减法来代替除法

可通过左移来加快速度 3*(2^3 + 2^1+2^0)+1=33

  • 边界问题

使用long,(long在64位编译器下是8个字节,32位编译器下是4个字节)

答案

  • python
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        #利用异或判断符号
        flag = -1 if (dividend>0) ^ (divisor>0) else 1
        dividend=abs(dividend)
        divisor=abs(divisor)
        c=0
        for i in range(31,-1,-1):
            if dividend>>i >=divisor:
                c+=1<<i
                dividend-=divisor<<i
                
        c=c if flag>0 else -c
        return min(c,2**31-1)#可能的结果[INT_MIN, -INT_MIN]但是要求是[INT_MIN, MIN_MAX]
  • c++
class Solution {
public:
    int divide(int dividend, int divisor) {
        // 利用异或判断符号
        int flag= (dividend>0)^(divisor>0)?-1:1;
 
        long beichu=labs(dividend),chu=labs(divisor), c=0;
        for (int i=31; i>=0; i--)
        
            if ((beichu>>i)>=chu)
            {
                c+=((long)1)<<i;//防止2147483648得不到,因为在int中2^31是INT_MAX,得到INT_MAX+1的数
                beichu-=chu<<i;
            }
        
        c=flag>0?c:-c;
        return c>INT_MAX?INT_MAX:c;//可能的结果[INT_MIN, -INT_MIN]但是要求是[INT_MIN, MIN_MAX]
   
            
        
    }
};
发布了78 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/puspos/article/details/103169089