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

C++でNを0に減らすために必要な特定のタイプの操作をカウントします


正の整数Nが与えられます。目標は、Nを0に減らすために必要な演算の数を見つけることです。適用される演算はN =N-Pです。ここで、PはPの最小の素数除数です。

例を挙げて理解しましょう

入力 − n =17

出力 − Nを0に減らすために必要な特定のタイプの操作の数は、− 1

説明 −17の最小の素数除数は17自体です。したがって、操作は17-17=0に1回だけ適用されます。

入力 − n =20

出力 − Nを0に減らすために必要な特定のタイプの操作の数は、− 10

説明 − 20の最小の素数の約数は2です。2を何度も減算し、次の素数の約数を見つけます:

20%2==0, 20-2=18
18%2==0, 18-2=16
…………………..14, 12, 10, 8, 6, 4, 2, 0 Total 10 times the operation is applied.

以下のプログラムで使用されているアプローチは次のとおりです

すべての偶数Nの場合、最小の素数除数は常に2になり、偶数Nから2を引くと、再び偶数になります。すべての奇数について、最小の素数除数は奇数になり、奇数から奇数を引いた後、数は偶数になるので、再び2が最小の素数になります。最小の素数除数を見つけるには、i =0からiまで、i * i

  • 入力として整数Nを取ります。

  • 関数N_to_Zero(int N)はNを取り、Nを0に減らすために必要な操作の数を返します。

  • countの初期値を0とします。

  • i=2から開始します。 (i * i)

  • (i * i)がNを超える場合は、i=Nに設定します。

  • 操作回数は1+(N-i)/2となります。

  • カウントを1+(N-i)/2として設定します。

  • 結果としてカウントを返します。

#include<bits/stdc++.h>
using namespace std;
int N_to_Zero(int N){
   int count = 0;
   int i = 2;
   while((i * i) < N && (N % i)){
      i++;
   }
   if((i * i) > N){
      i = N;
   }
   count = 1 + (N-i)/2;
   return count;
}
int main(){
   int N = 10;
   cout<<"Count of operations of the given type required to reduce N to 0 are: "<<N_to_Zero(N);
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます-

Count of operations of the given type required to reduce N to 0 are: 5

  1. C++で重みが2の累乗である特定のツリー内のノードをカウントします

    ノードの重みを持つ二分木が与えられます。目標は、数が2の累乗になるような重みを持つノードの数を見つけることです。重みが32の場合は25なので、このノードがカウントされます。 例 入力 値を入力した後に作成されるツリーを以下に示します- 出力 Count the nodes in the given tree whose weight is a power of two are: 3 説明 we are given with the tree node and the weights associated with each node. Now we calculate the po

  2. C++のグリッドで指定された方向に可能な移動をカウントします

    サイズnxmのグリッドと開始点x、yを表す2つの変数nとmです。 また、移動((1,1)、(2,2))などとしてグリッド内を移動するために実行できるステップ/移動のペアも指定されます。移動の各ペアは、x、y軸で実行されるステップの単位を表します。目標は、境界[1、n] X [1、m]内のグリッド内をトラバースするために実行できる合計ステップを見つけることです。nが5、mが4、現在の位置が2、2で、選択されたステップが( 1、-1)次に、このステップを1回実行すると、(3,1)になります。このステップを再度実行すると、(4、-1)になります。これは、-1が範囲外であるため無効です。 例