| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | 
							- package main
 
- import (
 
- 	"strconv"
 
- 	"strings"
 
- )
 
- func fractionToDecimal(numerator int, denominator int) string {
 
- 	isNegtive := (numerator > 0 && denominator < 0) ||
 
- 		(numerator < 0 && denominator > 0)
 
- 	numer, deno := int64(numerator), int64(denominator)
 
- 	if isNegtive {
 
- 		numer = absInt64(numer)
 
- 		deno = absInt64(deno)
 
- 	}
 
- 	remainder := make(map[int64]int, 0) // 0 means not in dict yet
 
- 	digits := make([]int64, 0)
 
- 	remain := numer % deno
 
- 	digit := numer / deno
 
- 	for remainder[remain] == 0 {
 
- 		digits = append(digits, digit)
 
- 		remainder[remain] = len(digits)
 
- 		remain *= 10
 
- 		digit = remain / deno
 
- 		remain %= deno
 
- 	}
 
- 	if digit != 0 {
 
- 		digits = append(digits, digit)
 
- 	}
 
- 	var sb strings.Builder
 
- 	sb.WriteString(strconv.Itoa(int(digits[0])))
 
- 	hasLoop := false
 
- 	for i := 1; i < len(digits); i++ {
 
- 		if i == 1 {
 
- 			sb.WriteByte('.')
 
- 		}
 
- 		if i == remainder[remain] {
 
- 			sb.WriteByte('(')
 
- 			hasLoop = true
 
- 		}
 
- 		sb.WriteByte(byte(digits[i]) + '0')
 
- 	}
 
- 	if hasLoop {
 
- 		sb.WriteByte(')')
 
- 	}
 
- 	if isNegtive {
 
- 		return "-" + sb.String()
 
- 	}
 
- 	return sb.String()
 
- }
 
- func absInt64(x int64) int64 {
 
- 	if x < 0 {
 
- 		return -int64(x)
 
- 	}
 
- 	return int64(x)
 
- }
 
- // func main() {
 
- // 	println(fractionToDecimal(-1, -2147483648))
 
- // 	println(fractionToDecimal(-50, 8))
 
- // 	println(fractionToDecimal(2, 1))
 
- // 	println(fractionToDecimal(0, -5))
 
- // }
 
 
  |