C++ 中具有相同数字阶乘积的最大数


给定任务是找到最大数,该数没有前导或尾随零或一,其数字阶乘的乘积等于给定数字 N 的数字阶乘的乘积。

现在让我们用一个例子来理解我们必须做什么 -

输入 - N = 4912

输出 - 73332222

解释 - 4! * 9! * 1! * 2! = 7! * 3! * 3! * 3! * 2! * 2! *2! *2! = 17,418,240

输入 - N = 340

输出 - 3322

下面程序中使用的方案如下

  • 为了获得最大答案,我们将不得不将给定数字表示为素数阶乘的乘积。

    如果给定数字仅包含零和一,则无法找到输出。

  • 在函数 MaxNum() 中,创建一个 int 类型的变量 total_digits 来存储数字总数,并初始化另一个 int 类型的数组 Frq[] = {0} 来存储每个出现的数字的频率。

  • 循环从 i=0 到 i<total_digits,并检查每个数字是否为素数。

  • 如果当前数字是素数,则只需将数组 Frq[] 的该位置加 1。

  • 否则,如果数字不是素数,则通过单独的 if 语句检查它是否为 4、6、8 或 9,然后将其分解为其基本素数阶乘并相应地增加频率。

  • 创建一个空字符串 'ans' 来存储最终答案。

  • 在继续执行最后一步之前,检查数字是否仅包含一和零。如果是,则只需返回原始字符串,否则继续执行下一步。

  • 循环从 i=9 到 i>=2。初始化一个 int 类型的变量 C = Frq[i],并在 for 循环内创建一个 while 循环,条件为 while(C--),其中放置 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

更新于: 2020-08-17

101 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告