给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
题目看似简单,坑还是蛮多的。
开始觉得只要拿到绝对值,除法转为减法,a/b abs(a)- abs(b) 然后计数即可。尝试了一下先不管方法是否可行,在a特别大,b特别小的时候这速度。。。。。此方案直接pass
任何一个整数可以表示成以2的幂为底的一组基的线性组合
![]()
2的多少次方可以用位移操作来计算
class Solution {
fun divide(dividend: Int, divisor: Int): Int {
if (0 == divisor) return 0
if (dividend == Int.MIN_VALUE && -1 == divisor) return Int.MAX_VALUE
var dividendL: Long = absMy(dividend.toLong())
var divisorL: Long = absMy(divisor.toLong())
var result = 0
val sign = (dividend shr 31) xor (divisor shr 31)
// println("sign:$sign")
while (dividendL >= divisorL) {
var c = 1
var temp = divisorL
while (dividendL >= temp shl 1) {
temp = temp shl 1
c = c shl 1
}
result += c
dividendL -= temp
}
return when {
result >= Int.MAX_VALUE -> Int.MAX_VALUE
sign < 0 -> 0 - result
else -> result
}
}
}
fun absMy(entry: Long) = if(entry >0) entry else 0 - entry
注:leetcode上居然不支持默认的abs方法,没辙了再外面自己瞎写一个凑合
这是我刚刚申请的微信公众号,欢迎大家关注。

本文介绍了一种在不使用乘法、除法和模运算符的情况下,实现两个32位有符号整数相除的方法。通过将除法问题转化为一系列减法操作,并利用位移来加速计算过程,该方法能够有效处理包括负数和溢出在内的各种情况。
1021

被折叠的 条评论
为什么被折叠?



