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
广告