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

C++で合計がKに等しい最小フィボナッチ項


この問題では、数値Kが与えられます。私たちのタスクは、合計がKに等しい最小フィボナッチ項を見つけることです。 。

フィボナッチ数列は、前の2つの数値を加算することにより、後続の数値を生成します。フィボナッチ数列は、F0とF1の2つの数字から始まります。 F0とF1の初期値は、それぞれ0、1、または1、1にすることができます。

フィボナッチ数列は011 2 3 5 8 13

問題を理解するために例を見てみましょう

入力

K = 5

出力

2

説明

The sum 5 can be made using 3 and 2.

ソリューションアプローチ

フィボナッチ数を使用すると、1がフィボナッチ数であるため、任意の数として合計を取得できます。 1 n回加算すると、合計はnになります。私たちの仕事は、合計を与えるフィボナッチ数の数を最小限に抑えることです。コインがフィボナッチ数の値を持っているコイン交換問題からベースをとることによって、解決策を達成することができます。プログラミング言語では、この問題を解決する手法は欲張りアプローチと呼ばれます。

最初に、合計n以下になるまでフィボナッチ数を合計します。次に、最後の項から始めて、その項をnからn>k番目の項まで減算します。そして、並べて、用語の数のカウントを増やします。 n

アルゴリズム

  • フィボナッチ項を計算する関数を作成します。

  • n以下のすべてのフィボナッチ項を計算します。

  • 次の項がnより大きい場合は、それをベクトルにプッシュして返さないでください。

  • 合計がnに等しいフィボナッチ項の最小数を見つける関数を作成します。

  • ベクトルを初期化して、フィボナッチ項を格納します。

  • 合計nから合計>0までフィボナッチ項を減算します。

  • 合計nをj番目のフィボナッチ項で割って、合計に寄与する項の数を求めます。

  • 得られたカウントを出力として出力します。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
void findFiboTerms(vector<int>& fiboVals, int K){
   int i = 3, nextTerm;
   fiboVals.push_back(0);
   fiboVals.push_back(1);
   fiboVals.push_back(1);
   while (1) {
      nextTerm = fiboVals[i - 1] + fiboVals[i - 2];
      if (nextTerm > K)
         return;
      fiboVals.push_back(nextTerm);
      i++;
   }
}
int findTermForSum(int K){
   vector<int> fiboVals;
   findFiboTerms(fiboVals, K);
   int termCount = 0, j = fiboVals.size() - 1;
   while (K > 0) {
      termCount += (K / fiboVals[j]);
      K %= (fiboVals[j]);
      j--;
   }
   return termCount;
}
int main(){
   int K = 11;
   cout<<"Minimum Fibonacci terms with sum equal to K is "<<findTermForSum(K);
   return 0;
}

出力

Minimum Fibonacci terms with sum equal to K is 2

  1. C++での等しい合計とXOR

    この問題では、整数nが与えられます。私たちのタスクは、i =0からnまでの整数の数を見つけるプログラムを作成することです。ここで、合計はXORに等しくなります。つまり、(n + i)=(n ^ i)。 問題を理解するために例を見てみましょう 入力: n =4 出力: 4 説明: 0からnまでのiのすべての値を考慮して i =0、4 + 0 =4、4 ^ 0 =4 i =1、4 + 1 =5、4 ^ 1 =5 i =2、4 + 2 =6、4 ^ 2 =6 i =3、4 + 3 =7、4 ^ 3 =7 i =4、4 + 4 =8、4 ^ 4 =0 カウント=4 ソリュー

  2. Xとの合計がC++のフィボナッチ数であるノードをカウントします

    ノードの重みを数値として持つ二分木を指定します。目標は、その数がフィボナッチ数であるような重みを持つノードの数を見つけることです。フィボナッチ数列の数は次のとおりです。0、1、1、2、3、5、8、13…。n番目の数はの合計です。 (n-1)番目と(n-2)番目。重みが13の場合、それはフィボナッチ数であるため、ノードがカウントされます。 例 入力 temp=1。値を入力した後に作成されるツリーを以下に示します- 出力 Count the nodes whose sum with X is a Fibonacci number are: 3 説明 we are given with