166.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "strconv"
  4. "strings"
  5. )
  6. func fractionToDecimal(numerator int, denominator int) string {
  7. isNegtive := (numerator > 0 && denominator < 0) ||
  8. (numerator < 0 && denominator > 0)
  9. numer, deno := int64(numerator), int64(denominator)
  10. if isNegtive {
  11. numer = absInt64(numer)
  12. deno = absInt64(deno)
  13. }
  14. remainder := make(map[int64]int, 0) // 0 means not in dict yet
  15. digits := make([]int64, 0)
  16. remain := numer % deno
  17. digit := numer / deno
  18. for remainder[remain] == 0 {
  19. digits = append(digits, digit)
  20. remainder[remain] = len(digits)
  21. remain *= 10
  22. digit = remain / deno
  23. remain %= deno
  24. }
  25. if digit != 0 {
  26. digits = append(digits, digit)
  27. }
  28. var sb strings.Builder
  29. sb.WriteString(strconv.Itoa(int(digits[0])))
  30. hasLoop := false
  31. for i := 1; i < len(digits); i++ {
  32. if i == 1 {
  33. sb.WriteByte('.')
  34. }
  35. if i == remainder[remain] {
  36. sb.WriteByte('(')
  37. hasLoop = true
  38. }
  39. sb.WriteByte(byte(digits[i]) + '0')
  40. }
  41. if hasLoop {
  42. sb.WriteByte(')')
  43. }
  44. if isNegtive {
  45. return "-" + sb.String()
  46. }
  47. return sb.String()
  48. }
  49. func absInt64(x int64) int64 {
  50. if x < 0 {
  51. return -int64(x)
  52. }
  53. return int64(x)
  54. }
  55. // func main() {
  56. // println(fractionToDecimal(-1, -2147483648))
  57. // println(fractionToDecimal(-50, 8))
  58. // println(fractionToDecimal(2, 1))
  59. // println(fractionToDecimal(0, -5))
  60. // }