题目:
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
For example,
用HashMap记录余数作为key与余数出现的位置。C++和Java需要将int转换为long。要注意正负号的问题。
C++版:
class Solution { public: string fractionToDecimal(int numerator, int denominator) { if(numerator == 0) return "0"; string result; if((numerator < 0) ^ (denominator < 0)) result += "-"; long n = numerator; long d = denominator; n = abs(n); d = abs(d); result += to_string(n / d); long r = n % d; if(r == 0) return result; result += "."; unordered_map<long, int> re; while(r) { if(re.find(r) != re.end()) { result = result.substr(0, re[r]) + "(" + result.substr(re[r], result.length()-re[r]) + ")"; break; } re.insert(pair<long, int>(r, result.length())); result += to_string(r * 10 / d); r = r * 10 % d; } return result; } };
public class Solution { public String fractionToDecimal(int numerator, int denominator) { if(numerator == 0) return "0"; StringBuilder s = new StringBuilder(); if((numerator < 0) ^ (denominator < 0)) s.append("-"); long n = numerator, d = denominator; n = Math.abs(n); d = Math.abs(d); s.append(Long.toString(n / d)); long r = n % d; if(r == 0) return s.toString(); s.append("."); Map<Integer, Integer> m = new HashMap<>(); while(r != 0) { if(m.containsKey((int)r)) { s.insert(m.get((int)r), "("); s.append(")"); break; } m.put((int)r, s.length()); s.append(Integer.toString((int)(r * 10 / d))); r = r * 10 % d; } return s.toString(); } }
class Solution: # @param {integer} numerator # @param {integer} denominator # @return {string} def fractionToDecimal(self, numerator, denominator): if numerator == 0: return "0" result = "" if (numerator < 0) ^ (denominator < 0): result += "-" numerator = abs(numerator) denominator = abs(denominator) result += str(numerator / denominator) if numerator % denominator == 0: return result result += "." d ={} x = numerator % denominator while x: if x in d: result = result[:d[x]] + "(" + result[d[x]:] + ")" break d[x] = len(result) r = (x * 10) / denominator x = (x * 10) % denominator result += str(r) return result