题目描述:
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: “0.5”
示例 2:
输入: numerator = 2, denominator = 1
输出: “2”
示例 3:
输入: numerator = 2, denominator = 3
输出: “0.(6)”
方法1:
主要思路:
(1)模拟除法的过程;
(2)先求出整数部分;
(3)若不是整除,加上点之后,处理小数部分;
(4)为了避免循环小数的情形,使用unordered_map来统计之前出现过的数字,及对应的索引;
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
//避免越界
long long num=numerator;
long long den=denominator;
string str;
if(num*den<0){
str+='-';//处理符号
}
num=abs(num);
den=abs(den);
str+=to_string(num/den);//处理整数部分
num%=den;
if(num==0){
return str;
}
//处理小数部分
unordered_map<long long,long long>mp;
str+='.';
int end=-1;
while(num){
//表示出现了循环情形
if(mp.count(num)){
end=mp[num];//得到循环的位置
break;
}
else{
mp[num]=str.size();//统计字符
}
//接着做除法
num*=10;
str+=to_string(num/den);
num%=den;
}
if(num==0){//判断是否是循环的情形
return str;
}
return str.substr(0,end)+"("+str.substr(end)+")";//循环的情形
}
};