一、题目介绍
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
本题就是将除法的计算过程,转变成代码。小数部分是否有循环的判定方式,当被除数相同时,除以相同的除数得到结果必定相同。因此对于小数部分的计算,我们需要通过一个哈希映射mp,记录每次被除数的值,以及该值所对应的商在res(记录结果的字符串)中的位置index。当检测到某一个被除数num在mp中已经出现过时,则从mp[num]所对应位置到字符串res结尾之间为循环部分。
三、解题代码
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator == 0)
return "0";
string res;
long num = numerator;
long den = denominator;
if(num * den < 0) //判断结果的正负号
res = "-";
num = abs(num);
den = abs(den);
//先计算整数部分
res += to_string(num/den);
num %= den;
if(num == 0)
return res;
res += ".";
int i = res.size();
unordered_map<long, int> mp;
//计算小数部分
while(num && mp[num] == 0) //如果余数为0,或者检测到重复的被除数
{
mp[num] = i++;
num *= 10;
res += to_string(num/den);
num %= den;
}
if(num)
{
res = res.substr(0, mp[num]) + "(" + res.substr(mp[num]) + ")"; //带有循环小数的返回结果
}
return res;
}
};