1. 程式人生 > >leetcode29. 兩數相除

leetcode29. 兩數相除

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

利用<< 左位移,相當於乘以2,>>右位移,相當於除以2
說明:

被除數和除數均為 32 位有符號整數。
除數不為 0。
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231,  231 − 1]。本題中,如果除法結果溢位,則返回 231 − 1。
class Solution {
 fun divide(dividend: Long, divisor: Long): Long {
    if (divisor == 0L) {
        return 0
    }
    val sign = if (dividend.xor(divisor).ushr(31) > 0) -1 else 1

    var result = 0L
    var m = Math.abs(dividend)
    var n = Math.abs(divisor)

    if (n == 1L) {
        return sign * m
    }

    while (m >= n) {
        var t = n
        var p = 1
        while (m >= t shl 1) {
            p = p shl 1
            t = t shl 1
        }
        m -= t
        result += p
    }

    return sign * result


}}