मान लीजिए कि हमारे पास दो नंबर N और K हैं। काम K नंबरों को प्रिंट करना है, जो 2 की घात है और उनका योग N है। यदि यह संभव नहीं है, तो -1 को वापस करें। . मान लीजिए एन =9 और के =4, तो आउटपुट 4 2 2 1 होगा, जिसका योग 9 है, और तत्वों की संख्या 4 है, और उनमें से प्रत्येक 2 की शक्ति है।
इस समस्या को हल करने के लिए हमें इन चरणों का पालन करना होगा -
-
यदि k, N में सेट बिट्स की संख्या से कम है या संख्या N से अधिक है, तो -1 पर लौटें
-
सेट बिट्स पर दो की शक्तियों को प्राथमिकता कतार में जोड़ें
-
जब तक हम K तत्व प्राप्त नहीं कर लेते, तब तक प्राथमिकता कतार शुरू करें, फिर तत्व को प्राथमिकता कतार से हटा दें
-
हटाए गए तत्व/2 को दो बार फिर से प्राथमिकता कतार में डालें
-
यदि k तत्व प्राप्त होते हैं, तो उन्हें प्रिंट करें।
उदाहरण
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
void displayKnumbers(int n, int k) {
int set_bit_count = __builtin_popcount(n);
if (k < set_bit_count || k > n) {
cout << "-1";
return;
}
priority_queue<int> queue;
int two = 1;
while (n) {
if (n & 1) {
queue.push(two);
}
two = two * 2;
n = n >> 1;
}
while (queue.size() < k) {
int element = queue.top();
queue.pop();
queue.push(element / 2);
queue.push(element / 2);
}
int ind = 0;
while (ind < k) {
cout << queue.top() << " ";
queue.pop();
ind++;
}
}
int main() {
int n = 30, k = 5;
cout << "Numbers are: ";
displayKnumbers(n, k);
} आउटपुट
Numbers are: 8 8 8 4 2