Leetcode29. 两数相除

本文详细解析了LeetCode第29题“两数相除”的算法实现,不使用乘法、除法和模运算符完成除法运算,通过倍减策略提高效率,适用于32位有符号整数运算。

Leetcode29. 两数相除

题目:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2

说明:

被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,231−1][−2^{31}, 2^{31} − 1][231,2311]。本题中,如果除法结果溢出,则返回 231−12^{31} − 12311

题解:
不能一点点相减,效率太低,考虑倍减:如2147483647/2》》除以2,4,8,16……不能倍增就从2再开始。
scala代码:

 def divide(dividend: Int, divisor: Int): Int = {

    var negtive = 0
    //判断是否是Int.MinValue
    var flag = 0
    var dividend1 = dividend
    var divisor1 = divisor
    if (dividend1 == Int.MinValue && divisor1 == -1) Int.MaxValue
    if (dividend1 == Int.MinValue && divisor1 == 1) Int.MinValue
    //如果dividend1是最小值,flag=1
    if (dividend1 == -2147483648) {
      dividend1 = 2147483647
      flag = 1
    }
    if (dividend1 < 0) {
      dividend1 = -dividend1
      negtive = -1
    }
    if (divisor1 < 0) {
      divisor1 = -divisor1
      negtive = -1
    }
    //最终结果
    var ret = 0
    //除数的多少倍
    var count = 1
    //当前除数
    var divisorTmp = divisor
    //不能一点点相减,效率太低,考虑倍减:如2147483647/2》》除以2,4,8,16……不能倍增就从2再开始
    while (dividend1 - divisor1 >= 0) {
      ret = ret + count
      dividend1 = dividend1 - divisorTmp

      if (dividend1 > divisorTmp + divisorTmp) {
        //倍数翻倍
        count = count + count
        //除数翻倍
        divisorTmp = divisorTmp + divisorTmp
      } else {
        count = 1
       divisorTmp= divisor1
      }
    }
    //消除被除数+1的影响,如最后剩3/4,就需要把结果+1
    if (flag == 1) {
      val s = if (dividend1 + 1 == divisor1) 1 else 0
      ret = ret + s
    }

    if (negtive == 0) ret else -ret //正负判断
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值