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))
// }