思路
不能用乘除,那就是位运算呗。
拿14 除以 2 举例。
先设基为1,因为2小于14,2左移得4,基左移得2。4还是小于14,4左移得8,基左移得4。8还是小于14,8左移得16,16大于14,因此左移结束。
从第一个不大于14的数开始,即从把8开始,基为4。14减去8剩余6。减去8相当于减去4个2,这个4就是基,所以商应该加4。
6小于8,因此8右移得4,基右移得2,操作如上,直到最后被除数等于0。
溢出只可能是被除数是-2147483648,除数是-1,结果才会溢出,特判一下即可。
学到了一招判断结果是否是负数的小技巧,在代码里。
代码
import kotlin.math.absclass Solution {fun divide(dividend: Int, divisor: Int): Int {if (dividend == 0 || divisor == 0) return 0if (dividend == Int.MIN_VALUE && divisor == -1) return Int.MAX_VALUEval isNeg = (dividend xor divisor) < 0var base = 1var sum = 0var dividend = abs(dividend.toLong())var divisor = abs(divisor.toLong())while (dividend > divisor shl 1) {divisor = divisor shl 1base = base shl 1}while (dividend != 0L) {while (dividend >= divisor) {dividend -= divisorsum += base}divisor = divisor shr 1base = base shr 1}return if (isNeg) -sum else sum}}
