题意:

image.png

解题思路:

  1. 思路:模拟除法过程

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer $numerator
  4. * @param Integer $denominator
  5. * @return String
  6. */
  7. function fractionToDecimal($numerator, $denominator) {
  8. if ($denominator == 0) return "0";
  9. $ans = "";
  10. if (($numerator < 0 && $denominator > 0)
  11. || ($numerator > 0 && $denominator < 0)) {
  12. $ans = "-";
  13. }
  14. $n = abs($numerator);
  15. $d = abs($denominator);
  16. $ans .= floor($n / $d);
  17. $mod = $n % $d;
  18. if ($mod == 0) return $ans;
  19. $ans .= ".";
  20. $map = [];
  21. while ($mod != 0) {
  22. if (isset($map[$mod])) {
  23. $ans = substr_replace($ans, "(", $map[$mod], 0);
  24. $ans .= ")";
  25. break;
  26. }
  27. $map[$mod] = strlen($ans);
  28. $mod *= 10;
  29. $ans .= floor($mod / $d);
  30. $mod %= $d;
  31. }
  32. return $ans;
  33. }
  34. }

GO代码实现:

  1. func fractionToDecimal(numerator int, denominator int) string {
  2. if denominator == 0 {return ""}
  3. var ans string
  4. if numerator * denominator < 0 {
  5. ans += "-"
  6. }
  7. n, d := ABS(numerator), ABS(denominator)
  8. ans += strconv.Itoa(n / d)
  9. mod := n % d
  10. if mod == 0 {return ans}
  11. ans += "."
  12. hm := make(map[int]int)
  13. rptPos := -1
  14. for (mod != 0) {
  15. if pos, ok := hm[mod]; ok {
  16. rptPos = pos
  17. break
  18. }
  19. hm[mod] = len(ans)
  20. mod *= 10
  21. ans += strconv.Itoa(mod / d)
  22. mod %= d
  23. }
  24. if rptPos == -1 {
  25. return ans
  26. }
  27. return fmt.Sprintf("%s(%s)", ans[:rptPos], ans[rptPos:])
  28. }
  29. func ABS(v int ) int {
  30. if v < 0 {return -v}
  31. return v
  32. }