假设我们有两个字符串,分别是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