मान लीजिए कि हमारे पास दो नंबर 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