C++ 中相等的有理数


假设我们有两个字符串 S 和 T,每个字符串都表示一个正有理数。我们需要检查它们是否表示相同的数字。

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

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

  • 整数部分.非重复部分(如 0.5、1.0、2.12、2.0001)

  • 整数部分.非重复部分(重复部分>)(如 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,

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

    • 如果 i 在 S 长度的范围内,则:

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

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

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

        • base := base + rep

      • 返回 base 作为实数值

    • 返回 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

更新于: 2020-06-04

156 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告