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(C--)的while循环,其中将ans + =(char)(i + 48)放入字符串中以存储最终答案回答

示例

#include <bits/stdc++.h>
using namespace std;
string MaxNum(string str){
   int total_digits = str.length();
   int Frq[15] = { 0 };
   //获取每个数字的频率
   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 = "";
   //如果数字只有1或0-
   if (Frq[1] == total_digits || Frq[0] == total_digits || (Frq[0] + Frq[1]) == total_digits){
      return str;
   }
   else{
      //可能的最大数量
      for (int i = 9; i >= 2; i--){
         int C = Frq[i];
         while (C--){
            ans += (char)(i + 48);
         }
      }
      return ans;
   }
}
//主要功能
int main(){
   string str = "340";
   cout << MaxNum(str);
   return 0;
}

输出结果

如果运行上面的代码,我们将获得以下输出-

3322