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
广告