LeetCode--29.两数相除

题目

题解

1、采用直接想减的方式进行处理

//直接相减,在leetCde中无法提交,提示超时
    public static int divide(int dividend, int divisor){
        int quotient = 0;
        boolean postiveNumber = true;
        if((dividend>0 && divisor<0) ||  (dividend<0 && divisor>0)){
            postiveNumber = false;
        }
        long absDividend = Math.abs((long)dividend);
        long absDivisor = Math.abs((long)divisor);
        while(absDividend >= absDivisor){
            absDividend -= absDivisor;
            quotient++;
            if(quotient >= Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }
        }
        if(!postiveNumber){
            return -quotient;
        }
        return  quotient;
    }

2、使用移位运算实现计算

public static int divide1(int dividend, int divisor){
        //存放商数
        long quotient = 0;
        //返回结果值
        int result = 0;
        //判断返回结果是+/-
        boolean postiveNumber = true;
        //两种情况返回结果为-
        if((dividend>0 && divisor<0) ||  (dividend<0 && divisor>0)){
            postiveNumber = false;
        }
        //将除数和被除数进行取绝对值,转为long型防止-2^31绝对值后变为0.
        long absDividend = Math.abs((long)dividend);
        long absDivisor = Math.abs((long)divisor);
        //如果被除数小于除数,返回结果为0.
        if(absDividend<absDivisor) return 0;
        /**
         *该方法类似递归,当被除数大于等于除数时,将一直调用移位算法进行计算。
         * 当移位算法满足条件后,用被除数-移位算法的除数最大值,下一次调用移位算法时,使用差值作为被除数,并且每次的移位值进行累加。
         * 当最后一次被除数和除数相等时,商数最后加1,得到商值。
         */
        while (absDividend >= absDivisor) {
            long tmp = absDivisor,tempQuotient=1 ;
            /**
             * 当被除数大于等于临时除数移位后的值时,对临时除数和临时商数进行移位。
             */
            while(absDividend >= tmp<<1){
                tmp<<=1;
                tempQuotient<<=1;
            }
            absDividend -= tmp;
            quotient += tempQuotient;

        }
        /**
         * 商值使用long存储,当商值>int类型的最大值,返回商值最大值。
         * 由于int类型的除法出现最大值的情况有以下两种:
         * 1、-2147483648 / 1 = -2147483648 不需要取最大值,最后的计算结果正确。
         * 2、-2147483648 / -1 = 2147483648 需要取int类型的最大值。
         */
        return result = postiveNumber? quotient>Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)quotient : (int)-quotient;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值