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