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