给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:“0.5”
示例 2:
输入:numerator = 2, denominator = 1
输出:“2”
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分数,----->小数
3、思路分数,1 可以直接整除
2、不可整除, -----> 除的尽
------------------>除不尽,循环了
1、直接写,如果整除 就直接写,
2、如果没有,就按分析的,使用一个map存起来, 对应数字,和下标,
时间:O(l),字符串的长度
空间:O(l) 字符串的长度
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
long long n = numerator, d = denominator; // 搞成长整型
string res; // 结果集合
if(n * d < 0) res += "-";// 如果是负数
if(n < 0) n *= -1; // 都搞成正数
if(d < 0) d *= -1;
long a = n / d; // 正数部分,得是long 而不能是int
res += to_string(a);
n %= d; // 取剩下的余数
if(n == 0){ // 能整除,就直接是结果了,
return res;
}
res += "."; // 如果不能整除肯定是小数部分:
int index = 0;
string s; // 存 商
unordered_map mp;
while(n && mp.count(n) == 0){ // 除尽,或者出现循环了,就跳出循环
mp[n] = index++; // 第一个余数,存到map[0]
n *= 10; // 乘以10,为了获取 商,
s.push_back(n/d + '0'); // 小数点后第一位小数,的商,
n %= d; // 再次取一下余数
}
if(n != 0){ // 出现循环,
res += s.substr(0, mp[n]) + "("+ s.substr( mp[n] ) + ")"; // 如果没有第二个参数,
// 默认搞到结尾,
}
else{
res += s;
}
return res;
}
};



