题目描述:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
解法:
class Solution {
public:
string itoa(long long num){
string res = "";
if(num == 0){
return "0";
}else{
while(num != 0){
res = char(num%10 + '0') + res;
num /= 10;
}
return res;
}
}
string fractionToDecimal(int num, int den) {
long long numerator = num;
long long denominator = den;
if(numerator == 0){
return "0";
}
bool neg = false;
if(numerator < 0){
neg = !neg;
numerator = -numerator;
}
if(denominator < 0){
denominator = -denominator;
neg = !neg;
}
unordered_map<int, int> mp;
long long left = numerator/denominator;
// cout<<left<<endl;
numerator %= denominator;
vector<int> lst;
int idx = 0;
while(numerator != 0 && mp.find(numerator) == mp.end()){
// cout<<numerator<<endl;
mp[numerator] = idx++;
numerator *= 10;
int digit = numerator/denominator;
numerator %= denominator;
// cout<<digit<<", "<<numerator<<", "<<denominator<<", "<<idx<<endl;
lst.push_back(digit);
}
string res = itoa(left);
if(neg){
res = "-" + res;
}
if(mp.empty()){
return res;
}else{
res += '.';
if(numerator == 0){
for(int digit : lst){
res += char('0' + digit);
}
return res;
}else{
int idx = mp[numerator];
int sz = lst.size();
for(int i = 0; i < idx; i++){
res += char('0' + lst[i]);
}
res += '(';
for(int i = idx; i < sz; i++){
res += char('0' + lst[i]);
}
res += ')';
return res;
}
}
}
};