题目描述
给定两个整数,分别表示分数的分子 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
当余数出现循环的时候,对应的商也会循环。
循环用余数除以除数,并记录每一次除法产生的商和余数,如果余数为0或者余数在之前出现过,则停止循环。余数为0直接输出结果;余数在之前出现过,找到出现过的余数对应商的位置,将左括号加在其前,右括号加在字符串尾部。
注意极端情况:−2147483648/-1或-1/−2147483648
代码(c++)
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
string res;
if(denominator==0) return res;
if(numerator==0) return "0";
res=(numerator^denominator)<0?"-":"";
long long ll_numerator=abs((long long)numerator);
long long ll_denominator=abs((long long)denominator);
long long quotient=ll_numerator/ll_denominator;
res+=to_string(quotient);
long long reminder=ll_numerator%ll_denominator;
if(reminder==0) return res;
res+=".";
map<int,int> mp;
string remain;
int index=0;
while(reminder!=0&&mp.find(reminder)==mp.end()){
mp[reminder]=index++;
ll_numerator=reminder*10;
quotient=ll_numerator/ll_denominator;
reminder=ll_numerator%ll_denominator;
remain+=to_string(quotient);
}
if(reminder==0){
res+=remain;
return res;
}
remain.insert(mp[reminder],"(");
res=res+remain+")";
return res;
}
};