leetcode#166 分数到小数
题目:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 1e4 。
示例:
输入:numerator = 1, denominator = 2
输出:"0.5"
思路:
不难想到非循环小数的写法,也就是正常的除法,对于循环小数的循环节,可以发现,当一个余数重复出现时,说明发现了循环节,我们用unordered_map记录余数–>位置,当余数重复出现时,跳出并且加括号就行了。
代码:
class Solution
{
public:
string ex(long num)
{
if (!num)
return "0";
string tmp;
while (num)
{
tmp += num % 10 + '0';
num /= 10;
}
reverse(tmp.begin(), tmp.end());
return tmp;
}
string fractionToDecimal(int numerator, int denominator)
{
string ans;
unordered_map<int, int> mp;
long n = (long)numerator, m = (long)denominator, pos = 0;
bool point = false, cycle = false;
if (n < 0 && m > 0)
ans += '-', n = -n;
else if (n > 0 && m < 0)
ans += '-', m = -m;
string num = ex(n / m);
ans += num;
if (n % m == 0)
return ans;
ans += ".";
n = n % m;
while (n && !mp.count(n))
{
mp[n] = ans.length() - 1;
n *= 10;
ans += ex(n / m);
n = n % m;
}
if (mp.count(n))
{
ans.insert(mp[n]+1, "(");
ans.push_back(')');
}
return ans;
}
};