29. 两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2

说明:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1
  • class Solution 
    {
    public:
        int divide(int dividend, int divisor) 
        {
            //位运算除法
            //10/3 ==> 最接近10的数:3*2^1+3*2^0(divisor*2^1+divisor*2^0)所以商为2^1+2^0=3
            //21/4: 4扩大2倍等于8,8<21,则再扩大2倍等16,继续,32>21,则用21-16 =5,返回值为:4(即扩大的倍数)
            //29 /8: 8扩大2倍为16,继续扩大为32,则29-16=13,返回2倍,继续循环13/8,16>13,则返回1,最后2+1 =3;
            
            long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;//用longlong防止越界
            if (m < n) return 0;    
            while (m >= n)
            {
                long long t = n, p = 1;// p为倍数
                while (m > (t << 1))
                {
                    //执行判断操作
                    t <<= 1;
                    p <<= 1;
                }
                res += p;//倍数之和
                m -= t;// 除数减去增倍之后的数
            }
            if ((dividend < 0) ^ (divisor < 0))
                {
                    res = -res;
                }
            return res > INT_MAX ? INT_MAX : res;
        }
    };
    
    //这题很多版本,加减乘除用位运算解决。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值