题目
July 10, 2021 · View on GitHub
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:"0.5"
示例 2:
输入:numerator = 2, denominator = 1
输出:"2"
示例 3:
输入:numerator = 2, denominator = 3
输出:"0.(6)"
示例 4:
输入:numerator = 4, denominator = 333
输出:"0.(012)"
示例 5:
输入:numerator = 1, denominator = 5
输出:"0.2"
提示:
- -231 <= numerator, denominator <= 231 - 1
- denominator != 0
参考答案
class Solution {
public:
using LL = long long;
string fractionToDecimal(int numerator , int denominator) {
if (numerator == 0) return "0";
string rs;
unordered_map<int, int> us;
vector<int> vi;
bool f1 = numerator < 0, f2 = denominator < 0;
LL num = abs(numerator), den = abs(denominator);
// 小数点前
LL q = num / den;
rs += to_string(num / den);
// 小数点后
LL r = num % den * 10;
string str;
while (r != 0 && us.find(r) == us.end()) {
vi.push_back(r);
us[r] = vi.size() - 1;
q = r / den;
str = str + to_string(q);
r = (LL)((r % den) * 10);
}
// 判断小数点后是否存在循环
if (r == 0) {
if (str != "") rs += "." + str;
} else {
// 如果有循环,从第几位开始循环
auto it = us.find(r);
int i = it->second;
rs += "." + str.substr(0, i) + "(" + str.substr(i, vi.size() - i) + ")";
}
// 符号不同,添加 负号
if (f1 != f2) {
rs = "-" + rs;
}
return rs;
}
};