C++ 中的分数转为循环小数

c++server side programmingprogramming

假设我们有两个整数,分别表示分数的分子和分母,我们必须以字符串格式找到分数。如果小数部分是重复的,则将重复部分括在括号中。因此,如果分子是 2 而分母是 3,则输出将是"0.(6)"

为了解决这个问题,我们将遵循以下步骤 −

  • 如果分子为 0,则返回 0

  • 定义一个数组 ans

  • 如果分子 < 0 且分母 > 0 或分子 0 且分母 < 0,则插入负号"-"放入 ans 数组中

  • 除数 := |分子| 且被除数 := |分母|,余数 :=除数 mod 被除数

  • x :=除数 / 被除数的字符串

  • 将 x 中的每个字符插入到 ans 数组中

  • 如果余数 = 0,则将 ans 数组作为字符串返回。

  • 插入点"。"进入 ans

  • 定义一个映射 m

  • 当余数不为 0 时

    • 如果余数存在于 m 中,则

      • 在 ans 的索引 m[余数] 处插入左括号

      • 在末尾的 ans 中插入右括号

      • 中断循环

    • 否则

      • m[余数] := ans 的大小

      • 余数 := 余数 * 10

      • 将 (余数 / 被除数) 作为字符插入 ans

      • 余数:= 余数 mod 被除数

  • 以字符串形式返回 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)

相关文章