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 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.