So, the best solution I have seen. 点击打开链接
Integer part is easy to handle. For the fraction part, we need to remember where the loop start. Thus, we need to remember the position to insert '(' and the remainder.
#include <string>
#include <unordered_map>
#include <iostream>
using namespace std;
string getDec(long remainder, long den) {
string res = "";
unordered_map<long, int> map;
int i = 0;
while((remainder != 0) && (map.find(remainder) == map.end())) {
map.insert(make_pair(remainder, i));
i++;
remainder = remainder * 10;
res = res + (to_string(remainder/den));
remainder = remainder % den;
}
if(remainder != 0) {
int pos = map[remainder];
res.insert(pos, 1, '('); // insert position, bytes, char
res = res + ")";
}
return res;
}
string fractionToDecimal(int numerator, int demoinator) {
long num = numerator;
long den = demoinator;
bool neg = num * den < 0;
num = abs(num);
den = abs(den);
string res = neg ? ("-" + to_string(num / den)) : to_string(num / den);
long remainder = num % den;
return (remainder == 0) ? res : (res + "." + getDec(remainder, den));
}
int main(void) {
cout << fractionToDecimal(4, 333) << endl;
}

本文介绍了一种使用C++实现将任意分数转换为十进制小数的方法,并特别关注了循环小数的处理过程。通过记录余数的位置来标识循环开始的位置,从而在输出的小数中正确插入括号表示循环节。
458

被折叠的 条评论
为什么被折叠?



