12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- package main
- import (
- "math"
- )
- /* func abs(x int) int {
- if x < 0 {
- return -x
- }
- return x
- } */
- // time out
- func divideOld(dividend int, divisor int) int {
- if divisor == 0 {
- return math.MaxInt32
- }
- var cnt, incr int64 = 0, 1
- if (dividend&(1<<32))^(divisor&(1<<32)) != 0 {
- incr = -1
- }
- dividend, divisor = abs(dividend), abs(divisor)
- for dividend >= divisor {
- dividend -= divisor
- cnt += incr
- }
- if cnt < math.MinInt32 || cnt > math.MaxInt32 {
- return math.MaxInt32
- }
- return int(cnt)
- }
- func divide(dividend int, divisor int) int {
- sign := 1
- // 判断同号、异号
- if (dividend>>31)^(divisor>>31) != 0 {
- sign = -1
- }
- dividend, divisor = abs(dividend), abs(divisor)
- res := 0
- // x/y: x -= y * 2^31, res += 2^31, x -= y * 2^30, res += 2^30, ...
- for i := uint(32); i > 0; i-- {
- if divisor<<(i-1) > dividend {
- continue
- }
- dividend -= divisor << (i - 1)
- res += 1 << (i - 1)
- }
- res *= sign
- // overflow
- if res < math.MinInt32 || res > math.MaxInt32 {
- return math.MaxInt32
- }
- return res
- }
- /* func main() {
- fmt.Println(divide(-1, 1))
- fmt.Println(divide(-1, -1))
- fmt.Println(divide(-1<<31, -1))
- fmt.Println(divide(1, 1))
- fmt.Println(divide(535, 1))
- } */
|