力扣之旅第26天(力扣第29题:两数相除)

(一、暴力法)

暴力法虽然能通过所有案例但是会超时。

代码如下:

class Solution {
    public int divide(int dividend, int divisor) {
        int result=1;
        int flag=0;
        if(dividend==-2147483648 && divisor==-1){
            return 2147483647;
        }
        if(dividend==divisor){
            return 1;
        }
        if(dividend>0 && divisor>0){
            if(dividend<divisor){
                return 0;
            }
            result=dividend-divisor;
            flag++;
            while(result>=divisor){
                result=result-divisor;
                flag++;
            }
        }
        if(dividend<0 && divisor<0){
            if(dividend>divisor){
                return 0;
            }
            result=dividend-divisor;
            flag++;
            while(result<=divisor){
                result=result-divisor;
                flag++;
            }
        }
        if(dividend>0 && divisor<0){
            if(dividend<(-divisor) || divisor==-2147483648){
                return 0;
            }
            result=dividend+divisor;
            flag++;
            while(result>=(-divisor)){
                result=result+divisor;
                flag++;
            }
            return -flag;
        }
        if(dividend<0 && divisor>0){
            if((-dividend)<divisor && dividend!=-2147483648){
                return 0;
            }
            result=dividend+divisor;
            flag++;
            while (result<=(-divisor)){
                result=result+divisor;
                flag++;
            }
            return -flag;
        }
        return flag;
    }
}

(二、递归)

我们利用递归函数可以大大缩减求得最终值的速度。

代码:

class Solution {
    public int divide(int dividend, int divisor) {
        if(dividend==0) return 0;//被除数为0,返回值为0
        if(divisor==-1){//除数为-1时
            if(dividend==-2147483648)
                return 2147483647;//结果超过数值范围返回最大数
            else
                return -dividend;//返回dividend的相反数
        }
        if(divisor==1) return dividend;//除数为1返回被除数dividend本身
        int flag=1;//标记值,标记值为1时结果为正数,不为1为负数
        if((dividend>0 && divisor<0) || (dividend<0 && divisor>0))//判断结果是否为负数
            flag=-flag;//如果结果为负数则更新flag值
        long a=dividend;//利用long将dividend的值赋值给a
        long b=divisor;//利用long将divisor的值赋值给b
        if(dividend<0){
            a=-a;//将dividend转为正数
        }
        if(divisor<0){
            b=-b;//将divisor转为正数
        }
        //利用long是为了不用考虑将dividend和divisor转换为正数时越界问题
        long result=div(a,b);//调用div方法得到最终结果
        if(flag==1){//判断结果是正数还是负数,正数返回result,负数返回-result
            return result>2147483647?214748364: (int) result;//判断结果是否越界,越界返回最大值2147483647,没有则返回result
        }
        else {
            return (int) -result;
        }
    }
    public long div(long a,long b){
        if(b>a){//如果除数大于被除数返回0
            return 0;
        }
        long result=1;//定义result初始值为1
        long b1=b;//将b1赋值为b,且为了保证除数b保留原始值,并且不用考虑b越界,因为测试时b1可能会越界
        while((b1+b1)<=a){//保证测试值的两倍不能 大于a值
            result=result+result;//结果翻倍
            b1=b1+b1;//测试值翻倍
        }
        return result+div(a-b1,b);//递归求解,直到除数b大于被除数a(更新后的a)
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值