假设我们有两个表示分数的分子和分母的整数,我们必须找到字符串格式的分数。如果小数部分是重复的,请将重复的部分括在括号中。因此,如果分子为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)