Cho hai chuỗi S, T biểu diễn số hữu tỷ (có thể có phần lặp lại trong ngoặc đơn). Kiểm tra xem chúng có biểu diễn cùng một số không.
Ví dụ: S="0.(52)", T="0.5(25)" → true (cả hai đều bằng 52/99).
Giải thuật
- Hàm f(S) chuyển chuỗi thành số thực:
- Tìm vị trí '('.
- Nếu có phần lặp: tách phần cơ sở (base) và phần lặp (rep). Lặp rep 20 lần nối vào base, chuyển thành double.
- Nếu không có phần lặp: chuyển trực tiếp thành double.
- So sánh f(S) == f(T).
Ví dụ mã C++
#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);
}
};
int main(){
Solution ob;
cout << (ob.isRationalEqual("0.(52)", "0.5(25)"));
}
Đầu vào
"0.(52)", "0.5(25)"
Đầu ra
1