给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: “0.5”
示例 2:
输入: numerator = 2, denominator = 1
输出: “2”
示例 3:
输入: numerator = 2, denominator = 3
输出: “0.(6)”
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
string strRes = "";
if(denominator == 0) return strRes;
if(numerator == 0)
{
strRes += "0";
return strRes;
}
if((numerator > 0) ^ (denominator > 0))
{
strRes += "-";
}
long numA = fabs(numerator);
long numB = fabs(denominator);
if(numA % numB == 0)
{
strRes += to_string(numA/numB);
return strRes;
}
strRes += to_string(numA/numB);
strRes += ".";
numA = numA % numB;
vector<int> remain; //除数取余部分,发现重复表示小数部分第一个循环结束
vector<int> deci; //小数部分
while(numA != 0 && find(remain.begin(), remain.end(), numA) == remain.end())
{
remain.push_back(numA);
deci.push_back(numA*10/numB);
numA = (numA*10)%numB;
}
auto it1 = remain.begin();
auto it2 = deci.begin();
bool bHasCircule = false;
for(; it1 != remain.end(); it1++, it2++)
{
if(*it1 == numA)
{
bHasCircule = true;
strRes += "(";
}
strRes += to_string(*it2);
}
if(bHasCircule) //此处可用find函数找"("代替
{
strRes += ")";
}
return strRes;
}
};
难点在于如何判断是否是循环小数,以及找出循环节的位置
判断是循环: 跳出while循环的时候余数为0就不是循环小数
找出循环节的位置: 当同一个余数出现两次时,就找到了循环节