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".
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)".
特别烦这种处理数字的题……需要各种考虑边界条件。
对于这个题来说,首先要判断除数和被除数是否非0, 然后判断是否异号,这个题有一个陷阱test case是-2147483648,因为要对-2147483648进行取绝对值操作,取完绝对值之后会溢出,所以要考虑到把n和d存储为long型。
自己写的渣代码
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator == 0 || denominator == 0) return "0";
int f;
if((numerator < 0 && denominator < 0) || (numerator > 0 && denominator > 0)) f = 1;
else f = 0;
unordered_map<int, int> m;
long n = numerator, d = denominator, t = 0;
n = abs(n);
d = abs(d);
string res = "";
if(n >= d){
t = n / d;
n = n % d;
res += to_string(t);
}
else res += '0';
if(n != 0) res += '.';
int recur = res.size();
m[n] = recur++;
while(n != 0){
t = n * 10 / d;
n = (n * 10) % d;
if(m.find(n) == m.end()) {m[n] = recur++; res += t + '0';}
else{
string s1 = res.substr(0, m[n]);
string s2 = res.substr(m[n], res.size());
char c = t + '0';
res = s1 + '(' + s2 + c +')';
break;
}
}
return f ? res : '-'+res;
}
};