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)