题目:
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,
- Given numerator = 1, denominator = 2, return "0.5".
- Given numerator = 2, denominator = 1, return "2".
- Given numerator = 2, denominator = 3, return "0.(6)".
用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;
}
};
Java版:
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();
}
}
Python版:
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