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

C++での同じ桁の階乗積の最大数


与えられたタスクは、先頭または末尾のゼロ、またはその桁の階乗の積が指定された数値Nの桁の階乗の積に等しいものを含まない最大数を見つけることです。

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

入力 − n =4912

出力 − 73332222

説明 − 4! * 9! * 1! * 2! =7! * 3! * 3! * 3! * 2! * 2! * 2! * 2! =17,418,240

入力 − n =340

出力 − 3322

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

  • 最大の答えを得るには、与えられた数を素数の階乗の積として表現する必要があります。

    指定された数値に0と1しか含まれていない場合、出力を見つけることはできません。

  • 関数MaxNum()で、int型の変数total_digitsを作成して合計桁数を格納し、int型の別の配列Frq [] ={0}を初期化して、発生する各数値の頻度を格納します。

  • i =0からi

  • 現在の桁が素数の場合は、配列Frq[]のその位置に1を加算するだけです。

  • それ以外の桁は素数ではありません。次に、個別のifステートメントを使用して、4、6、8、または9のいずれかであるかどうかを確認し、基本的な階乗素数に分解して、それに応じて頻度を増やします。

  • 空の文字列「ans」を作成して、最終的な回答を保存します。

  • 最後のステップに進む前に、番号に1と0のみが含まれているかどうかを確認してください。その場合は、元の文字列を返すだけです。それ以外の場合は、次の手順に進みます。

  • i=9からi>=2までルー​​プします。 int型の変数C=Frq [i]を初期化し、forループ内に条件while(C--)のwhileループを作成します。ここで、ans + =(char)(i + 48)を入力して、最終的な回答を文字列に格納します。 ans。

#include <bits/stdc++.h>
using namespace std;
string MaxNum(string str){
   int total_digits = str.length();
   int Frq[15] = { 0 };
   //Obtaining the frequency of every digit
   for (int i = 0; i < total_digits; i++){
      if (str[i] == '1'|| str[i] == '2'|| str[i] == '3'|| str[i] == '5'|| str[i] == '7'){
         Frq[str[i] - 48] += 1;
      }
      // 4! = 2! * 2! * 3!
      if (str[i] == '4'){
         Frq[2] += 2;
         Frq[3]++;
      }
      // 6! = 5! * 3!
      if (str[i] == '6'){
         Frq[5]++;
         Frq[3]++;
      }
      // 8! = 7! * 2! * 2! * 2!
      if (str[i] == '8'){
         Frq[7]++;
         Frq[2] += 3;
      }
      // 9! = 7! * 3! * 3! * 2!
      if (str[i] == '9'){
         Frq[7]++;
         Frq[3] += 2;
         Frq[2]++;
      }
   }
   string ans = "";
   //If number has only 1 or 0
   if (Frq[1] == total_digits || Frq[0] == total_digits || (Frq[0] + Frq[1]) == total_digits){
      return str;
   }
   else{
      //Maximum number possible
      for (int i = 9; i >= 2; i--){
         int C = Frq[i];
         while (C--){
            ans += (char)(i + 48);
         }
      }
      return ans;
   }
}
//Main function
int main(){
   string str = "340";
   cout << MaxNum(str);
   return 0;
}

出力

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

3322

  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. C++で指定された製品のN個の整数の最大GCD

    2つの整数NとPがあるとします。PはN個の未知の整数の積です。これらの整数の可能な最大GCDを見つける必要があります。 N =3、P =24とすると、異なるグループは{1、1、24}、{1、2、12}、{1、3、8}、{1、4、6}、{2 、2、6}、{2、3、4}。 GCDは1、1、1、1、2、1です。したがって、ここで答えは2です。 Pのすべての素因数を見つけて、ハッシュマップに保存します。素因数がすべての整数で共通である場合、N個の整数の最大公約数は最大GCDになります。したがって、P =p 1の場合 k1 * p 2 k2 *…*p n kn 。ここで、piは素因