分数到小数
分数到小数
问题描述
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal
思路
在小数部分如果出现两次除数相同的情况即说明是循环小数.
来源:https://leetcode-cn.com/problems/fraction-to-recurring-decimal/solution/li-yong-hashbiao-ding-wei-xun-huan-by-just_coding/
题解
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
string ret;
if (denominator == 0) return ret;
if (numerator == 0) return "0";
long long num = numerator;
long long denom = denominator;
if (num < 0 && denom > 0 || num > 0 && denom < 0) {
ret += "-";
}
num = abs(num);
denom = abs(denom);
ret += to_string(num / denom);
num = num % denom;
if (num != 0) {
ret += ".";
}
map<long long, int> table;
int index = 0;
while (num != 0 && table.find(num) == table.end()) {
table[num] = index++;
num *= 10;
ret += to_string(num / denom);
num %= denom;
}
if (table.find(num) != table.end()) {
ret += "()";
int cur = ret.size() - 2;
while (index-- > table[num]) {
swap(ret[cur], ret[cur - 1]);
--cur;
}
}
return ret;
}
};