1.函数—两数相除

Part1 函数
二.两数相除

题目链接:<29. 两数相除 - 力扣(LeetCode)>

知识模块:

INT_MAX=231-1;INT_MIN=-231

思路:

  1. 分析特殊值:dividend=0/divisor=1/diviser=-1(注意取反可能会溢出)
  2. 引入符号,把a(dividend),b(divisor)全变成 负数(防溢出) 方便计算
  3. 引入一个参量count,设其初值为1,引入一个tb,赋值为b(为了后续计算不改变b值)
  4. 以2n的速度迅速逼近结果

例:202304/24

(24)+(24)<=(202304)

count=2, tb=48

原式=2+(202304-48)/24

(48)+(48)<=(202304)

count=4, tb=96

原式=4+(202304-96)/24

……

原式=8429+(202304-202296)/24

202304-202296=8<24 跳出循环

算法:

  1. 用if语句计算特殊值
  2. 定义符号sign,同号取1异号取-1
  3. 判断a,b是否为负,不是就变成负
  4. 表达式:a/b=count+(a-b*count)/b
  5. 令tb初值为b,循环:count自加,b自加,a减去之后返回新值
  6. 若a>b,退出循环(a,b为负数)

代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (dividend == 0) return 0;
        if (divisor == 1) return dividend;
        if (divisor == -1) {
            return dividend == INT_MIN ? INT_MAX : -dividend;//若为最小整数INT_MIN,取反为2^31超过最大整数,此时取最大整数INT_MAX
        }
        int a = dividend;
        int b = divisor;
        int sign = 1;
        if ((a > 0 && b < 0) || (a < 0 && b>0)) {
            sign = -1;
        }
        a = a > 0 ? -a : a;
        b = b > 0 ? -b : b;//a,b全部转为负数防止溢出
        int res = div(a, b);
        return sign == -1 ? -res : res;
    }//根据原a,b的正负判断结果的正负
    int div(int a, int b) {
        if (a > b) return 0;//|a|<|b|,即不能再除得整数
        int count = 1;
        int tb = b;//把b的值赋给一个临时的tb上,后续不改变b值
        while (tb >= a - tb) {
            count += count;
            tb += tb; //
        }//按照思路4设计,可迅速逼近所求值
        return count + div(a - tb, b);//返回解的值,交给上方符号判断
    }
};

注意:

  • 第25行循环条件不可以写成((tb+tb)>=a),这样也会造成超出数值边界 即溢出!
  • 若环境无存储空间限制,可转为正数计算,更符合思维,此时把int换成long扩大空间即可防止溢出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值