两数相除

思路一

不能用除法,那就用乘法,设置一个计数器result,然后通过比较result*divisordividend的大小,让计数器累加,不满足条件跳出循环即可。先对除数和被除数进行处理,都取绝对值,最后返回结果的时候再处理,因为题目设置的是整数范围,所以为了确保处理的正确性,使用long类型的临时变量。

    public static int divide(int dividend, int divisor) {
        if (dividend == 0){
            return 0;
        }
        long result = 0;
        boolean tag = true;
        if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
            tag = false;
        }
        long temp1 = dividend;
        long temp2 = divisor;
        if (temp1 < 0){
            temp1 = - temp1;
        }
        if (temp2 < 0){
            temp2 = - temp2;
        }
        while (true){
            if (result * temp2 <= temp1){
                result++;
            }else {
                break;
            }
        }
        result -= 1;
        if (tag){
            if (result > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) result;
            }
        }else {
            if (result < Integer.MIN_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) -result;
            }
        }
    }

结果超时了。。。。。。。。。。因为如果divisor的绝对值很小,比如1,而dividend却很大,比如是Integer.MAX_VALUE,这样时间复杂度就太高了。

思路二

在思路一的基础上进行优化,思路一相当于每次都减divisor,可以让其成倍的减,第一次减divisor,下一次就减2*divisor

假设divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n = dividend。那么我们总共只进行了n次操作,这个时间复杂度显然就是O(log(dividend / divisor))。而如果divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n > dividend,但是divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1) < dividend,那么我们就要以dividend - (divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1))为被减数进行重复的操作,即从divisor开始减起。直至我们的被减数小于divisor为止。
 

public static int divide(int dividend, int divisor) {
        if (dividend == 0){
            return 0;
        }
        long result = 0;
        boolean tag = true;
        if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
            tag = false;
        }
        long temp1 = dividend;
        long temp2 = divisor;
        if (temp1 < 0){
            temp1 = - temp1;
        }
        if (temp2 < 0){
            temp2 = - temp2;
        }
        while (temp1 >= temp2){
            long k = 1;
            long t = temp2;
            while (temp1 >= t) {
                temp1 -= t;
                result += k;
                k += k;
                t += t;
            }
        }
        if (tag){
            if (result > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) result;
            }
        }else {
            if (result < Integer.MIN_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) -result;
            }
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值