要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%'
剩下的就还剩下减法、位运算
减法的话会有效率问题,涉及到超大数。。会越界
所以最好的方法就是位运算
func divide(_ a: Int, _ b: Int) -> Int {
if ( a == Int32.min && b == -1) || ( a == Int32.max && b == 1) {
return Int( Int32.max )
}
if a == Int32.min && b == 1 {
return Int( Int32.min )
}
if a == Int32.min && b == Int32.min {
return 1
}
if b == Int32.min {
return 0
}
let flag = a ^ b >= 0 ? 1 : -1
var tempA = abs(a)
let tempB = abs(b)
var res = 0
//被除数比除数小,后边不用再算了
if tempA < tempB {
return flag == 1 ? res : -res
}
for i in (0...31).reversed() {
if ( tempA >> i ) - tempB >= 0 {
tempA -= ( tempB << i )
res += ( 1 << i )
}
}
return flag == 1 ? res : -res
}