题目
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
-2^31 <= numerator, denominator <= 2^31 - 1
denominator != 0
思路
这是一道典型的模拟题,可以选用小时候刚学除法时候的思路求解
用除数和被除数相除,整数加入字符串,余数乘10后再与被除数相除直到余数为0
但是此处需要考虑到小数为无限循环小数,可以将余数添加到哈希表中,当循环到余数重复时,说明相除后会呈现循环数,此时退出计算。
代码
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
long long num=numerator, den=denominator;
string str;
if(num*den<0) str+='-';
num = abs(num);den = abs(den);
if(!(num%den)){
str+=to_string(num/den);
return str;
}
str+=to_string(num/den);
str+='.';
unordered_map<long long, int> mp;
string str1;
num=num%den;
int i=0;
while(num&&!mp.count(num)){
mp[num]=i++;
num*=10;
str1+=to_string(num/den);
num%=den;
}
if(num!=0){
//str='('+str1+')';
str1=str1.substr(0, mp[num])+"("+str1.substr(mp[num])+")";
}
str+=str1;
return str;
}
};
问题
- 没有考虑到余数乘10后会大于in范围,应用long long
- 没有考虑到两数可能会出现一正一负的情况,需要对两数取绝对值
- 第一次判断失误,出现循环小数时将小数点后面的数全判断为循环数