Find k numbers which are powers of 2 and have sum N in C++


Suppose we have two numbers N and K. The task is to print K numbers, which are the power of 2 and their sum is N. If it is not possible, then return -1. Suppose N = 9 and K = 4, then the output will be 4 2 2 1, whose sum is 9, and a number of elements is 4, and each of them is a power of 2.

We have to follow these steps to solve this problem −

  • If k is less than the number of set bits in N or more than the number N, then return -1

  • Add the powers of two at set bits into the Priority queue

  • Initiate the priority queue till we get K elements, then remove the element from the priority queue

  • Insert the removed element/2 twice into the priority queue again

  • If k elements are achieved, then print them.

Example

 Live Demo

#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);
}

Output

Numbers are: 8 8 8 4 2

Updated on: 19-Dec-2019

106 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements