【leetcode】166. Fraction to Recurring Decimal
程序员文章站
2024-01-20 09:41:22
...
题目:
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
思路:
小数点后的数字是否出现循环,关键看余数(余数或者余数乘10都行)是否出现重复出现。每次求出余数时,都会将余数以及对应的index保存到map中。如果map中没有此余数,说明此余数未出现过,直接将余数以及对应的index保存到map中就好;如果发现余数在map中,说明余数重复出现了,则取出此余数值对应的index,然后在index位置插入“(”。最后在末尾处再追加“)”即可。
1/7的计算过程如下:
1/70的计算过程如下:
代码实现:
真就根据test case一点一点改的,全是细节。相比于编写程序,设计测试用例真的是一件很难的事情,需要你考虑周全所有的情况。
编写程序时,所有参与运算的变量一定要用long类型,否则会出现溢出,test case有相应的边界测试。
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (numerator == 0){
return "0";
}
string ret = "";
bool positive;
if ((numerator > 0 && denominator > 0) || (numerator < 0 && denominator < 0)){
positive = true;
}else{
positive = false;
}
long long_numerator = numerator;
long long_denominator = denominator;
long_numerator = abs(long_numerator);
long_denominator = abs(long_denominator);
ret += to_string(long_numerator/long_denominator);
if (long_numerator % long_denominator == 0){
if (positive == false){
ret = "-"+ret;
}
return ret;
}
ret += ".";
long times;
long remain = long_numerator % long_denominator;
unordered_map<int, int> my_map;
do{
remain *= 10; // 此行代码也可以放到“my_map[remain] = ret.size()”后面,一样的事。
if (my_map.find(remain) != my_map.end()){
int left_i = my_map[remain];
ret.insert(left_i,1,'(');
ret += ')';
break;
}
my_map[remain] = ret.size();
times = remain / long_denominator;
remain = remain % long_denominator;
ret += to_string(times);
}while (remain);
if (positive == false){
ret = "-"+ret;
}
return ret;
}
};
参考:
https://blog.csdn.net/fuxuemingzhu/article/details/82533218