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

C++のサイズkのサブセットの積の後続ゼロの最大数


与えられたタスクは、サイズNの特定の配列のサイズKのサブセットの積で後続ゼロの最大数を見つけることです。

例を使用して、私たちがしなければならないことを理解しましょう-

入力 − arr [] ={5、20、2}、K =2

出力 − 2

説明 −サイズ=2の合計3つのサブセットを作成できます。

[5、20]の積は100です。

[20、2]の積は40です。

[5、2]の積は10です。

100の末尾のゼロの最大数は2です。したがって、2が答えです。

入力 − arr [] ={60、40、25}、K =2

出力 − 3

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

  • 関数を開始する前に、上部に#defineM5100を配置します。

  • 関数MaxZeros()で、2D配列Sub [K + 1] [M5 + 5]を作成し、その各値を-1で初期化し、Sub [0] [0] =0;

    に設定します。
  • P =0からP

  • 条件while(Arr [P]%2 ==0)でwhileループを開始し、ループ内でP2++とArr[P] / 2を実行して、2の数を取得します。 P5についても同じ手順を繰り返します。

  • 次に、上記の開始されたForループ内で、ネストされた2つのforループを次のように初期化します-

    for(int i =K-1; i> =0; i--)

    for(int j =0; j

  • これらのループ内で、if(Sub [i] [j]!=-1)を確認し、それがtrueの場合は、Sub [i + 1] [j + P5] =max(Sub [i + 1]; [j + P5 ]、Sub [i] [j] + P2);

#include <bits/stdc++.h>
using namespace std;
#define M5 100
int MaxZeros(int* Arr, int N, int K){
   //Initializing each value with -1;
   int Sub[K+1][M5+5];
   memset(Sub, -1, sizeof(Sub));
   Sub[0][0] = 0;
   for (int P = 0; P < N; P++){
      int P2 = 0, P5 = 0;
      // Maximal power of 2 in Arr[P]
      while (Arr[P] % 2 == 0){
         P2++;
         Arr[P] /= 2;
      }
      // Maximal power of 2 in Arr[P]
      while (Arr[P] % 5 == 0) {
         P5++;
         Arr[P] /= 5;
      }
      /* We can collect 2s by checking first i numbers and taking their j with total power of 5*/
      for (int i = K - 1; i >= 0; i--)
         for (int j = 0; j < M5; j++)
         // If subset[i][j] is not calculated.
         if (Sub[i][j] != -1)
            Sub[i + 1][j + P5] = max(Sub[i + 1][j + P5], Sub[i][j] + P2);
   }
   /* Taking minimum of 5 or 2 and maximizing the result*/
   int ans = 0;
   for (int i = 0; i < M5; i++)
   ans = max(ans, min(i, Sub[K][i]));
   return ans;
}
//Main function
int main(){
   int Arr[] = { 60, 40, 25 };
   int K = 2;
   int N = sizeof(Arr) / sizeof(Arr[0]);
   cout << MaxZeros(Arr, N, K);
   return 0;
}

出力

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

3

  1. C++での最大積4倍の数を見つける

    n個の要素を持つ1つの整数配列があるとします。配列内の4倍の最大積を見つける必要があります。したがって、配列が[3、5、20、6、10]のような場合、最終積は6000であり、4倍の要素は10、5、6、20です。 これを解決するには、次の手順に従います- 配列を昇順で並べ替えます xが最後の4つの要素の積、yが最初の4つの要素の積、zが最初の2つと次の2つの要素の積であると仮定します x、y、zの最大値を返します。 例 #include<iostream> #include<algorithm> using namespace std; int maxQuadP

  2. Xのような最小数Xを見つけてください! C++では少なくともY個の末尾のゼロが含まれています

    数Yを取る必要があります、Xのような最小の数Xを見つけます!少なくともY個のトレーニングゼロが含まれています。たとえば、Y =2の場合、Xの値は10です。Xとして! =3228800。Y個のゼロがあります。 二分探索を使用してこれを解決できます。 Nの後続ゼロの数! N!の因数5の数で与えられます。 Xは、範囲[0、5 * Y]で二分探索を使用して見つけることができます。 例 #include<iostream> using namespace std; int factorCount(int n, int X) {    if (X < n) &nb