leetcode-29. 两数相除-repeat

66 阅读1分钟

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的  。

注意: 假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

const Max = Math.pow(2,31) - 1
const Min = Math.pow(2,31)

if(dividend === 0){
    return 0
}
if(dividend === Min && divisor === -1){
    return Max
}
if(divisor === -1){
    return dividend === -2147483648 ? 2147483647 : -dividend
}
if(divisor === 1){
    return dividend === -2147483648 ? -2147483648 : dividend

}
let a = Math.abs(dividend), b = Math.abs(divisor), res = 0
let flag = dividend^divisor
for(let i = 31; i>=0; i--){
    if(a >> i >=b){
        res += 1 << i 
        a -= b << i
    }
}

return flag < 0 ? -res : res
//注意这个方法在处理溢出得时候有问题