समस्या विवरण
मान लीजिए हमारे पास एक बाइनरी संख्या है, जो संख्या n का प्रतिनिधित्व करती है। हमें उस संख्या का बाइनरी प्रतिनिधित्व ढूंढना है जो सबसे छोटी लेकिन n से बड़ी हो, और जिसमें समान संख्या में 0 और 1 हों। इसलिए यदि संख्या 1011 (दशमलव में 11) है, तो आउटपुट 1101 (13) होगा। इस समस्या को अगले-क्रमपरिवर्तन गणना का उपयोग करके पाया जा सकता है।
एल्गोरिदम
nextBin(bin)
शुरुआत
len := bin की लंबाई
i को len-2 से 1 तक नीचे की ओर लूप
यदि bin[i] 0 है और bin[i+1] = 1, तो
bin[i] और bin[i+1] को एक्सचेंज करें
ब्रेक
अंत यदि
अंत लूप
यदि i = 0, तो कोई परिवर्तन नहीं, वापस करें
अन्यथा j := i + 2, k := len - 1
जब तक j < k लूप
यदि bin[j] 1 है और bin[k] 0 है, तो
bin[j] और bin[k] को एक्सचेंज करें
j और k को 1 से बढ़ाएं
अन्यथा यदि bin[i] 0 है, तो
ब्रेक
अन्यथा
j को 1 से बढ़ाएं
अंत यदि
अंत लूप
bin वापस करें
अंत
C++ प्रोग्राम उदाहरण
#include <iostream>
using namespace std;
string nextBinary(string bin) {
int len = bin.size();
int i;
for (int i = len-2; i >= 1; i--) {
if (bin[i] == '0' && bin[i+1] == '1') {
char ch = bin[i];
bin[i] = bin[i+1];
bin[i+1] = ch;
break;
}
}
if (i == 0)
return "कोई बड़ी संख्या मौजूद नहीं";
int j = i+2, k = len-1;
while (j < k) {
if (bin[j] == '1' && bin[k] == '0') {
char ch = bin[j];
bin[j] = bin[k];
bin[k] = ch;
j++;
k--;
}
else if (bin[i] == '0')
break;
else
j++;
}
return bin;
}
int main() {
string bin = "1011";
cout << "अगली बड़ी संख्या का बाइनरी मान = " << nextBinary(bin);
}
आउटपुट
अगली बड़ी संख्या का बाइनरी मान = 1101