整数除法java实现

class Solution {
    //本题要求不能使用*,/,%符号那我们只能用最原始的方式来做了,a能减多少个b是的b<a。
    //但是这种做法的缺点在于时间复杂度为O(a),我们改进以下索性让a先减去b的一个2n方倍的小于a的最大数,然后计算出a减去了2n方个b如此循环,这样做将时间复杂度减到O(loga),
    //如何解决正负号的问题呢,我们只能将两个数全部转化为负数来做(不转化为正号的原因在于最小的一个负号转化为正号会出现溢出的情况),我们使用一个标志位来最终判断最终结果的负号。
    public int divide(int a, int b) {
        //首先判断溢出的情况
        if(a == 0x80000000 && b == -1){
            return Integer.MAX_VALUE;
        }
        //首先要做的是将除数和被除数都转化为负号,并且使用一个标志位用于判断最终的结果
        int mark = 2;
        int result = 0;
        if(a > 0){
            mark--;
            a = -a;
        }
        if(b > 0){
            mark--;
            b = -b;
        }
        //判断结束之后使用循环的方式做除法
        while(a <= b){
            int value = b;
            int step = 1;
            while(value > 0xc0000000 && value + value >= a){
                value = value + value;
                step = step + step;
            }
            result = step + result;
            a = a - value;
        }
        //最终处理除结果
        if(mark !=  1){
            return result;
        }else{
            return -result;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值