मान लीजिए हमारे पास दो स्ट्रिंग्स 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) परिभाषित करें जो स्ट्रिंग को पार्स करता है
यदि '(' मिलता है, तो आधार और आवर्ती भाग निकालें
पर्याप्त परिशुद्धता के लिए आवर्ती भाग को कई बार (20) जोड़ें
परिणामी स्ट्रिंग को double में परिवर्तित करें
f(S) और f(T) की तुलना करें
उदाहरण
#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)"));
return 0;
}
इनपुट
"0.(52)", "0.5(25)"
आउटपुट
1