समस्या विवरण
मान लीजिए हमारे पास दो संख्याएं हैं जिन्हें अंश और हर कहा जाता है जो (अंश/हर) के रूप में एक परिमेय संख्या को दर्शाती हैं। हमें इसका दशमलव प्रतिनिधित्व एक स्ट्रिंग के रूप में ढूंढना है। यदि कुछ आवर्ती संख्याएं हैं, तो उन्हें ब्रैकेट से घेरें।
उदाहरण के लिए, यदि इनपुट है अंश = 164 हर = 3, तो आउटपुट "54.(6)" होगा।
हल करने का दृष्टिकोण
इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:
- यदि अंश == 0, तो "0" वापस करें
- एक ऐरे ans परिभाषित करें
- यदि अंश < 0 और हर > 0 या अंश > 0 और हर < 0, तो '-' को ans के अंत में डालें
- divisor := |अंश|
- dividend := |हर|
- remainder := divisor % dividend
- x := (divisor / dividend) को स्ट्रिंग में बदलें
- x के प्रत्येक कैरेक्टर को ans के अंत में डालें
- यदि remainder == 0, तो ans को स्ट्रिंग के रूप में वापस करें
- '.' को ans के अंत में डालें
- एक मैप m परिभाषित करें
- जब तक remainder != 0:
- यदि remainder, m में नहीं है:
- ans के शुरुआत में '(' डालें
- ans के अंत में ')' डालें
- लूप से बाहर निकलें
- अन्यथा:
- m[remainder] := ans का आकार
- remainder := remainder * 10
- (remainder / dividend) + '0' को ans के अंत में डालें
- remainder := remainder % dividend
- यदि remainder, m में नहीं है:
- ans को स्ट्रिंग के रूप में वापस करें
उदाहरण
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string solve(int numerator, int denominator) {
if (numerator == 0) return "0";
vector<char> ans;
if (numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0)
ans.push_back('-');
long divisor = labs(numerator);
long dividend = labs(denominator);
long remainder = divisor % dividend;
string x = to_string(divisor / dividend);
for (int i = 0; i < x.size(); i++) {
ans.push_back(x[i]);
}
if (remainder == 0) {
return string(ans.begin(), ans.end());
}
ans.push_back('.');
map<long, int> m;
while (remainder != 0) {
if (m.find(remainder) != m.end()) {
ans.insert(ans.begin() + m[remainder], '(');
ans.push_back(')');
break;
} else {
m[remainder] = ans.size();
remainder *= 10;
ans.push_back((remainder / dividend) + '0');
remainder %= dividend;
}
}
return string(ans.begin(), ans.end());
}
};
string solve(int numerator, int denominator) {
return (new Solution())->solve(numerator, denominator);
}
int main() {
cout << solve(164, 3);
}
इनपुट
164, 3
आउटपुट
54.(6)