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
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP