29. 两数相除

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

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

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
29.两数相除

题解思路:
方法:二分查找+递归
假设a=10,b=3;(a/b)
1.判断边界条件,如果a为0,返回0;如果b为1,返回a,如果b为-1,怕判断a,如果a>最小值INT-MIN,就返回-a,否则返回最大值INT_MAX。
2.第一,判断a和b的大小关系,如果a<b,返回0。如果a>b,引入一个计数器cnt初始化为1。

首先,b的值翻倍即2b为6,接着判断a和2b的大小,如果a>2b,b就翻倍为2b为6,cnt也翻倍为2cnt,到了当b=6时,2*6=12>a=10,这时候cnt处于2-4之间,因此就把a-2b即为10-6=4在和b=3去比较,再累加到计数器cnt中。

再判断2b和a的关系,如果a>2b,2b继续翻倍,
注意b翻倍为2b的同时计数也要翻倍,cnt变为2cnt

函数代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==0)
        {
            return 0;
        }
        else if(divisor==1)
        {
            return dividend;
        }
        else if(divisor==-1)
        {
            if(dividend>INT_MIN)
            {
                return -dividend;
            }
            return INT_MAX;
        }
        long a=dividend;
        long b=divisor;
        int flag=1;
        if((a>0&&b<0)||(a<0&&b>0))
        {
            flag=-1;
        }
        a=a>0?a:-a;
        b=b>0?b:-b;
        long res=div(a,b);
        if(flag>0)
        {
            return res>INT_MAX?INT_MAX:res;
        }
        return -res;   
    }
    long div(long a,long b)
    {
        if(a<b)
        {
            return 0;
        }
        long temp_b=b;
        int cnt=1;
        while(temp_b*2<=a)
        {
            cnt=cnt*2;
            temp_b=temp_b*2;
        }
        return cnt+div(a-temp_b,b);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值