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