leetcode29. 两数相除

1、题目

https://leetcode-cn.com/problems/divide-two-integers/

2、题意

题解1:二进制
例如 100 3;
3看做二进制第一位 从低到高就为 3 6 12 24 48 96
可得100=3+96;总个数为1(2^0)+(2^5) = 33;
记录除数可以被除的最大值(100可以被除的最大值为96)然后更新res
res+=1<<i位可能为1<<31超出int范围要转换为ll;

class Solution {
public:
    int divide(int dividend, int divisor) {
        int sign = 1;
        if(dividend<0&&divisor>=0||dividend>=0&&divisor<0) sign = -1;
        long long res = 0;
        vector<long long> exp;
        long long a = abs(dividend),b = abs(divisor);
        for(long long i = b;i<=a;i = i+i)
            exp.push_back(i);
        for(int i=exp.size()-1;i>=0;i--)
        {
            if(a>=exp[i])
            {
                a-=exp[i];
                res+=1ll<<i; //减去第i位的个数  移31位INT会溢出;
            }
        }
        res = res*sign;
        if(res>INT_MAX||res<INT_MIN) return INT_MAX;
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值