整数除法(LeetCode)

今天和大家分享一个LeetCode的题

如下
在这里插入图片描述

题目描述

这个题的题目意思也很简单,就是只是用加减法实现除法的商的功能(因此这道题就变得比较接近计算机组成原理了,而不是简单的数学思维)。相信有基础的同学们都知道,应该用减法来实现除法,没错确实这道题的本质核心就是使用减法来实现除法,因为计算机实现除法就是用的减法嘛,但是好像又没你想得那么简单
在这里插入图片描述题目类型简单,但是只有20.7%的通过率,还挺有意思的哈!那就废话不多说,见代码和解析

代码和注释

int Abs(int a){//这是我自定义的一个取绝对值函数。因为考虑到我们传入的值为int类型。所以最大值为2147483647即(2^31-1)有一位的符号位,最小值为-2147483648.因为数据在计算机中表示的方式采用的是补码,所以最小值为(-2^31).至于这里为什么我这么做,而不用库函数的abs()函数,见下面注释
    if(a>=0){
        return a; 
    }else{
        uint32_t b=a;  //这里我采用unit32_t 类型是因为int类型最小值取绝对值之后,会出现越界的情况。如果不好理解,用long型也可以编译过
        return -b;
    }
}

int divide(int a, int b) {
    if(a==-2147483648 && b==-1){//这里就是对溢出情况进行处理
        return 2147483647;
    }
    unsigned int res=0;
    int flags=(a>0)^(b>0)?-1:1;//通过异或来对两个数的正负进行判断,因为我们做减法,肯定是通过两个正数来做减法,因此最后结果的正负取决于两个数的正负
   
    
    unsigned int  ua=Abs(a);//定义为unsigned int 就是为了做减法,所以得去除符号位
    unsigned int  ub=Abs(b);

    for( int i=31;i>=0;i--){//因为去除符号位后,最高位为0,所以只需移31位即可
        if((ua>>i)>=ub){//这里的方法就是计算机本质实现减法的方式,
        //将数据转换为二进制数据,我相信你立马就能明白。通过移位,相减除法就实现了。
        //比如8 /1 转换一下,就是(1000)/(1),即1000右移3,此时,1等于1,满足条件,
        //进行1000-1<<3等于0,那么结果就是1<<3,就是8了
            ua-=(ub<<i);
            res=res+( (uint32_t) 0x01<<i);
        }
    }

    return flags==1?res:-res;
}

结果展示:

在这里插入图片描述

题目链接

https://leetcode-cn.com/problems/xoh6Oh/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值