在 C++ 中查詢 k 個 2 的冪,其和為 N


假設我們有兩個數字 N 和 K。任務是列印 K 個數字,這些數字是 2 的冪,並且它們的和為 N。如果不可能,則返回 -1。假設 N = 9 且 K = 4,則輸出將為 4 2 2 1,其和為 9,元素數量為 4,並且每個元素都是 2 的冪。

我們必須遵循以下步驟來解決此問題:

  • 如果 k 小於 N 中設定位的數量或大於 N,則返回 -1

  • 將設定位處的 2 的冪新增到優先順序佇列中

  • 初始化優先順序佇列,直到我們獲得 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

更新於: 2019年12月19日

139 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.