C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

2の累乗であり、C++で合計Nを持つk個の数値を見つけます


NとKの2つの数値があるとします。タスクは、2の累乗で合計がNであるKの数値を出力することです。それが不可能な場合は、-1を返します。 。 N=9およびK=4とすると、出力は4 2 2 1になり、その合計は9で、要素の数は4であり、それぞれが2の累乗です。

この問題を解決するには、次の手順に従う必要があります-

  • kがNのセットビット数よりも小さいか、Nよりも大きい場合は、-1を返します

  • 設定されたビットで2の累乗を優先キューに追加します

  • K個の要素を取得するまで優先キューを開始してから、その要素を優先キューから削除します

  • 削除した要素/2を優先キューに再度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

  1. n個の数のGCDとLCMを見つけるためのC++プログラム

    これは、n個の数のGCDとLCMを見つけるためのコードです。すべてがゼロではない2つ以上の整数のGCDまたは最大公約数は、各整数を除算する最大の正の整数です。 GCDは最大公約数としても知られています。 2つの数値の最小公倍数(LCM)は、両方の数値の倍数である最小公倍数(ゼロではない)です。 アルゴリズム Begin    Take two numbers as input    Call the function gcd() two find out gcd of n numbers    Call the function l

  2. 再帰を使用して自然数の合計を見つけるC++プログラム

    自然数は1から始まる正の整数です。 自然数のシーケンスは-です 1, 2, 3, 4, 5, 6, 7, 8, 9, 10…… 再帰を使用して最初のn個の自然数の合計を見つけるプログラムは次のとおりです。 例 #include <iostream> using namespace std; int sum(int n) {    if(n == 0)    return n;    else    return n + sum(n-1); } int main() { &