分数转浮点数
如:
1 / 5 = 0.2
1 / 3 = 0.(3)
11 / 90 = 0.1(2)
numerator: 分子
denominator: 分母
std::string fraction2string(int numerator, int denominator)
{
if (denominator == 0)
{
return "";
}
if (numerator == 0)
{
return "0";
}
bool posFlag = false;
if ((numerator > 0 && denominator < 0)
|| (numerator < 0 && denominator > 0))
{
posFlag = true;
}
std::string result = "";
if (posFlag)
{
result = '-';
}
if (numerator < 0)
{
numerator = 0 - numerator;
}
if (denominator < 0)
{
denominator = 0 - denominator;
}
// 1. 取整数部分
int n = numerator / denominator;
result += std::to_string(n);
// 2. 余数部分
int m = numerator % denominator;
if (m == 0)
{
return result;
}
result += ".";
/* 以下三个变量为了记录可能的需要插入 ( 的位置 */
int idx = -1;
int off = result.size();
int cnt = 0;
/* 当不断 * 10 然后 / 分母时,不断记录余数,
* 一旦余数出现重复,那么表示开始了循环
* 那么此时便可break循环,此外,需要记录开始的索引位置,
* 用于记录 插入 ( 的位置 */
std::unordered_map<int, int> map;
while (true)
{
map[m] = cnt++;
m *= 10;
n = m / denominator;
m = m % denominator;
if (m == 0)
{
result += std::to_string(n);
// break;
// 此时可以直接 return
return result;
}
result += std::to_string(n);
if (map.find(m) != map.end())
{
idx = map[m];
result += ")";
break;
}
}
//if (idx != -1) // 无循环下被 return, 此时无需判断 idx 为 -1 选项
{
result.insert(idx + off, 1, '(');
}
return result;
}