Fraction to Recurring Decimal
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)”.
改题属于中等难度,将分数转换字符串形式,类似于将两个数字相除运算。相对这个,简单的是我们可以使用除和求模运算,不同的是转换为小数形式,难点在于如何处理循环小数。什么时候会有循环小数? 容易想到除运算余数重复出现的时候会产生循环,于是我们可以保存之前运算过程中的余数,当有重复时候运算可以停止,那这一段之间的就是循环部分。所以可以使用map key记录余数,为了方便插入循环括号,用map value记录当前余数时结果中字符的索引值。
另外为了处理int负数类型求绝对值溢出问题,中间过程使用int64_t存储。
题目没有说明余数为0情况,故不处理。
代码如下:
string fractionToDecimal(int numerator, int denominator) {
int64_t num = numerator;
int64_t den = denominator;
string result;
if (num < 0 && den > 0 || num > 0 && den < 0) {
result = "-";
}
if (num < 0) {
num = -num;
}
if(den < 0) {
den = -den;
}
result += to_string(num / den);
uint64_t remainder = num % den;
if (remainder == 0) {
return result;
}
result += ".";
unordered_map<uint64_t, int> remainderMap;
int index = result.size();//小数位数
while (remainder != 0) {
if (remainderMap.count(remainder)) {
result.insert(remainderMap[remainder], "(");
result.push_back(')');
break;
}
remainderMap[remainder] = index++;
remainder *= 10;
result += to_string(remainder / den);
remainder = remainder % den;
}
return result;
}