题目
思路
竖式法,分为整数,有限小数和无限循环小数三种情况。如果得到的是整数,直接用to_string返回。是小数的情况就先确定正负号,如果两个数同号就取正号,如果两个数异号就取负号。然后再加上整数部分和小数点。如果是无限循环小数的情况,可以用余数相同来判断是否有循环,用unordered_map存储小数后面的余数,如果余数相同就加上左右两边的括号,并且退出循环。
代码
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if((int64_t)numerator%denominator==0)
return to_string((int64_t)numerator/denominator);
int64_t up=abs((int64_t)numerator),down=abs((int64_t)denominator);
string ans(((numerator<0)^(denominator<0)?"-":"")+to_string(up/down)+".");
unordered_map<int64_t,int> index;
for(int i=ans.size();up=up%down*10;i++){
if(index.count(up)){
ans.insert(ans.begin()+index[up],'(');
ans.push_back(')');
break;
}
index[up]=i;
ans.push_back('0'+up/down);
}
return ans;
}
};