假设我们有两个表示分数的分子和分母的整数,我们必须找到字符串格式的分数。如果小数部分是重复的,请将重复的部分括在括号中。因此,如果分子为2,分母为3,则输出将为“ 0.(6)”。
为了解决这个问题,我们将遵循以下步骤-
如果分子为0,则返回0
定义一个数组ans
如果分子<0且分母> 0或分子0且分母<0,则将负符号'-'插入ans数组
除数:= |分子| 和分红:= |分母|,余数:=除数模分红
x:=除数/除数字符串
将x中的每个字符插入ans数组
如果remainder = 0,则返回ans数组作为字符串。
插入点“。” 进入ans
定义一张映射
而余数不为0
m [remainder]:= ans的大小
余数:=余数* 10
将(余数/红利)作为字符插入ans
余数:=余数mod股息
在ans的索引m [remainder]处插入括号
最后在括号中插入右括号
打破循环
如果m中存在余数,则
除此以外
返回ans数组作为字符串。
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator == 0)return "0";
vector <char> ans;
if(numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0)ans.push_back('-');
long divisor = labs(numerator);
long dividend = labs(denominator);
long remainder = divisor % dividend;
string x = to_string(divisor/dividend);
for(int i = 0; i < x.size(); i++){
ans.push_back(x[i]);
}
if(remainder == 0){
return string(ans.begin(), ans.end());
}
ans.push_back('.');
map <int, int> m;
while(remainder != 0){
if(m.find(remainder)!=m.end()){
ans.insert(ans.begin() + m[remainder], '(');
ans.push_back(')');
break;
}else{
m[remainder] = ans.size();
remainder *= 10;
ans.push_back((remainder / dividend) + '0');
remainder %= dividend;
}
}
return string(ans.begin(), ans.end());
}
};
main(){
Solution ob;
cout << ((ob.fractionToDecimal(100,6)));
}100 6
输出结果
16.(6)