leetcode29 Divide Two Integers

本文介绍了一种不使用乘法、除法或取余运算实现整数除法的方法。利用加法和位运算,通过逐步增加被减数的倍数来逼近结果,避免了时间溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个整数相除,返回结果,不用返回余数,如果结果溢出返回MAX_INT,不能使用乘法除法或者取余数的运算。
既然不能用乘 除 余 那么可用的是 加 减 位运算
举例:63 / 7 = 9

63 -7 -7 -7 - 7-….一直减到不能减(减的结果<7就是不能减了)为止 计数器统计减了多少次 可行 但网友亲测时间溢出
位运算
64 - 7 - 14 - 28 =15 下一个应该减56 但是已经看到15比56小了 所以不能再减了 应该重新开始 (1+2+4)
从7开始减 也就是15 -7 = 8下一个要减14 但是8已经小于14了 所以不能接着减了(1)
8 - 7 = 1(1)
1不能减(0)
总倍数(1+2+4 + 1+1=9)
改进就在于每次不是单纯的一直-7 而是试图减7*2 7*2*2 这样就可以快一些嘛 为什么不是7*3 7*3*3?因为*2是位运算就可以搞定的事情 *3就要用到乘法了 题目中说不能用乘法了
上代码:

public int divide(int dividend, int divisor) {
        int sign = 1 * (dividend>0?1:-1) * (divisor>0?1:-1); 
        long dividend_l = Math.abs((long)dividend);
        long divisor_l = Math.abs((long)divisor);
        System.out.println("dividend_l:"+dividend_l+"  divisor_l:" + divisor_l);
        long result = 0;
        long tempDivesor = divisor_l;
        long i = 1;
        while(true){
            if(dividend_l >= tempDivesor){
                dividend_l -= tempDivesor;
                tempDivesor <<= 1;
                result += i;
                i <<= 1;
            }
            else{
                if(tempDivesor == divisor_l){
                    break;
                }
                else{
                    i = 1;
                    tempDivesor = divisor_l;
                }
            }
        }
        if(result*sign < Integer.MAX_VALUE) return (int)result*sign;
        else return Integer.MAX_VALUE;
    }

这里有一个坑:
测试用例divide(-2147483648,-1)
被除数是integer的最小数 除数是1 如果直接取绝对值就会超过int的最大数 所以应该先转成long 扩大可取值范围 再取绝对值 并把结果存在long里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值