/*思路:
1.计算整数部分;这里主要注意,分子绝对值小于分母绝对值且分子分母异号时,要返回“-0”。
2.计算小数部分;思路:用一个hash表记住出现过的余数以及余数对应的位置,如果当前用于计算
小数的余数在hash表中存在,则应返回结果,注意添加循环小数的括号。
3.合并整数、小数部分,返回结果。
整体来说,思路相对简单,但是写代码时有很多细节需要注意。*/
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
string s0 = interger(numerator, denominator);
string s1 = decimal(numerator, denominator);
if(s1.empty()) return s0;
else return s0 + "." + s1;
}
string interger(long long numerator, long long denominator){//计算整数部分
string res;
long long num = numerator / denominator;
stringstream s;
s << num;
s >> res;
if(res == "0" && numerator * denominator < 0) res.insert(0, "-");
return res;
}
string decimal(int numerator, int denominator){//计算小数部分
long long n = numerator, d = denominator;
if(n < 0) n = -n;
if(d < 0) d = -d;
if(n >= d) n %= d;
unordered_map<int, int> appeared;
string res;
int count(0);
while(n != 0){
if(appeared.find(n) != appeared.end()){//余数出现过
res.insert(appeared[n], "(");
res += ")";
return res;
}
else{//余数未出现过
appeared[n] = count;
n *= 10;
int tmp = n/d;
n %= d;
res += ('0' + tmp);
}
++count;
}
return res;
}
};
LeetCode之Fraction to Recurring Decimal
最新推荐文章于 2019-08-21 11:22:20 发布
本文介绍了一种将任意分数转换为十进制小数的方法,重点在于如何处理循环小数,并通过使用哈希表来记录计算过程中的余数及其位置,确保能够正确标识循环节。文章详细解释了算法实现步骤,包括整数部分与小数部分的计算逻辑。
摘要由CSDN通过智能技术生成