मान लीजिए कि हमारे पास दो तार हैं, ये एस और टी हैं, जिनमें से प्रत्येक एक सकारात्मक परिमेय संख्या का प्रतिनिधित्व करता है, हमें यह जांचना है कि क्या वे एक ही संख्या का प्रतिनिधित्व करते हैं या अभी। स्ट्रिंग्स परिमेय संख्या के दोहराए जाने वाले भाग को दर्शाने के लिए कोष्ठक का उपयोग कर सकते हैं।
जैसा कि हम जानते हैं कि परिमेय संख्याओं को तीन भागों तक का उपयोग करके दर्शाया जा सकता है:एक पूर्णांक भाग, एक गैर-दोहराव वाला भाग और एक दोहराव वाला भाग। संख्या को निम्नलिखित तीन तरीकों में से एक में दर्शाया जाएगा -
-
केवल पूर्णांक भाग (जैसे 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)" जैसा है, तो आउटपुट ट्रू होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन f() को परिभाषित करें, यह S लेगा,
-
i :='(' का सूचकांक S
. में -
अगर मैं एस लंबाई की सीमा में है, तो -
-
आधार :=इंडेक्स 0 से i-1 तक S का सबस्ट्रिंग
-
rep :=इंडेक्स i + 1 से S का सबस्ट्रिंग (S - i - 3 की लंबाई)
-
इनिशियलाइज़ j :=0 के लिए, जब j <20, अपडेट करें (j को 1 से बढ़ाएँ), करें -
-
आधार:=आधार + प्रतिनिधि
-
-
वास्तविक मूल्य के रूप में वापसी आधार
-
-
S को वास्तविक मान के रूप में लौटाएं
-
-
मुख्य कार्य से निम्न कार्य करें -
-
सही लौटें जब 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); } }; main(){ Solution ob; cout << (ob.isRationalEqual("0.(52)", "0.5(25)")); }
इनपुट
"0.(52)", "0.5(25)"
आउटपुट
1