o0w0o / ARTS

ARTS 鸽友打卡🐦
2 stars 0 forks source link

Leedcode 29. Divide Two Integers #110

Open zwwhdls opened 4 years ago

zwwhdls commented 4 years ago

思路 用位运算。

数 a 向右移一位,相当于将 a 除以 2;数 a 向左移一位,相当于将 a 乘以 2


func divide(dividend int, divisor int) int {
    if dividend == 0 || divisor == 0 {
        return 0
    }
    result := 0

    // 处理符号问题
    flag := 1
    if dividend < 0 && divisor > 0{
        dividend = -dividend
        flag = -1
    }
    if dividend > 0 && divisor < 0 {
        divisor = -divisor
        flag = -1
    }
    if dividend < 0 && divisor < 0 {
        divisor = -divisor
        dividend = -dividend
    }

    // 用 << 代替除法,简化模拟除法的过程
    // 向左位移了几位,就包含(这个数的十进制)几个除数
    for dividend >= divisor {
        tmp := divisor
        for i := 0; dividend >= tmp; i++ {
            dividend -= tmp
            result += 1 << uint(i)
            tmp = tmp << 1
        }
    }

    // 处理取值边界问题
    result = flag * result
    if result > math.MaxInt32 {
        return math.MaxInt32
    }else if result< math.MinInt32{
        return math.MinInt32
    }
    return result
}
```