29. 两数相除

题目链接:https://leetcode-cn.com/problems/divide-two-integers/

思路:先判断最后的结构是负的还是正的,然后全部转换成正数做,最后加上符号即可。因为不能用除法、乘法和mod,所以我们考虑用减法,但是不能直接减,比如1e9  2,减的话每次减2肯定会超时(因为要减1e9/2次),所以我想的是递增减,就是说1e9  2,第一次减2(result+=1),第二次我减4(result+=2),第三次我减8(result+=4),当减数大于被减数的时候,假设最后剩下10  11(这样并没有结束,因为10还可以减2),这样就再从10  2开始减就好了(注意result每次加的数就可以啦)。所以当不能减的时候我们就递归到下一层去算重新从2开始减的值,这样每次当不能减的时候就递归一层,最后答案相加即可。递归出口就是被减数小于开始的时候的减数(例子里面是2),return 0即可。

注意:-2^31转成正数的时候要注意,这个数不能直接转成正数。还有就是很多边界问题需要考虑,这里不说了,代码里都有(边界问题很多坑,好好想想哦~~~)。

上代码:

class Solution {
    public int divide(int dividend, int divisor) {
        int flag = dividend > 0 && divisor < 0 || dividend < 0 && divisor > 0 ? -1 : 1;
        int x = 0;
        if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        } else if (dividend == Integer.MIN_VALUE && divisor == Integer.MIN_VALUE) {
            return 1;
        } else if (divisor == Integer.MIN_VALUE) {
            return 0;
        } else if (dividend == Integer.MIN_VALUE) {
            x = 1;
            dividend += Math.abs(divisor);
        }
        return flag == 1 ? x + newDivide(Math.abs(dividend), Math.abs(divisor)) : -x - newDivide(Math.abs(dividend), Math.abs(divisor));
    }
    public int newDivide(int dividend, int divisor) {
        if (Math.abs(dividend) < Math.abs(divisor)) {
            return 0;
        }
        int mul = 1;
        int result = 0;
        int tmp = divisor;
        while (dividend >= divisor) {
            dividend -= divisor;
            result += mul;
            if (Integer.MAX_VALUE - divisor < divisor) {
                break;
            }
            mul += mul;
            divisor += divisor;

        }
        return result + newDivide(dividend, tmp);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值