C ++中的相等有理数

假设我们有两个字符串,分别是S和T,每个字符串表示一个正有理数,我们必须检查它们是否表示相同的数字或现在。字符串可以使用括号来表示有理数的重复部分。

众所周知,有理数最多可以使用三个部分表示:整数部分,非重复部分和重复部分。该数字将以以下三种方式之一表示:

  • 仅整数部分(例如0、12、123)

  • IntegerPart.NonRepeatingPart(例如0.5、1.0、2.12、2.0001)

  • IntegerPart.NonRepeatingPart(RepeatingPart>)(例如0.1(6),0.9(9),0.00(1212))

例如0.1(6)或0.1666(6)或0.166(66)都是1/6的正确表示形式。

因此,如果输入像S =“ 0.(52)”和T =“ 0.5(25)”,那么输出将为True。

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

  • 定义一个函数f(),它将花费S,

    • base:= S的子串从索引0到i-1

    • rep:= S的子串从索引i +1到(S-i-3的长度)

    • 对于初始化j:= 0,当j <20时,更新(将j增加1),执行-

    • 将基数返回为实际值

    • 基地:=基地+代表

    • i:= S中'('的索引

    • 如果我在S长度范围内,则-

    • 返回S作为实际值

    • 从主要功能中执行以下操作-

    • 当f(S)与f(T)相同时返回true

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;class Solution {
       public:
       bool isRationalEqual(string S, string T){
          return f(S) == f(T);
       }
       double f(string S){
          auto i = S.find("(");
          if (i != string::npos) {
             string base = S.substr(0, i);
             string rep = S.substr(i + 1, S.length() - i - 2);
             for (int j = 0; j < 20; ++j)
             base += rep;
             return stod(base);
          }
          return stod(S);
       }
    };
    main(){
       Solution ob;
       cout << (ob.isRationalEqual("0.(52)", "0.5(25)"));
    }

    输入项

    "0.(52)", "0.5(25)"

    输出结果

    1