Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm k số là lũy thừa của 2 và có tổng N trong C ++


Giả sử chúng ta có hai số N và K. Nhiệm vụ là in ra K số, là lũy thừa của 2 và tổng của chúng là N. Nếu không được thì trả về -1 . Giả sử N =9 và K =4, thì đầu ra sẽ là 4 2 2 1, có tổng là 9 và số phần tử là 4 và mỗi phần tử có lũy thừa là 2.

Chúng tôi phải làm theo các bước sau để giải quyết vấn đề này -

  • Nếu k nhỏ hơn số bit đặt trong N hoặc nhiều hơn số N, thì trả về -1

  • Thêm lũy thừa của hai tại các bit đã đặt vào hàng đợi Ưu tiên

  • Bắt đầu hàng đợi ưu tiên cho đến khi chúng ta nhận được K phần tử, sau đó xóa phần tử khỏi hàng đợi ưu tiên

  • Chèn phần tử đã loại bỏ / 2 lần nữa vào hàng đợi ưu tiên

  • Nếu đạt được k phần tử thì hãy in chúng ra.

Ví dụ

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

Đầu ra

Numbers are: 8 8 8 4 2