题目描述
让将F(x)定义为其数字的阶乘积。例如,F(124)=1!*2!*4!=48
首先,选择一个由n位数字组成的十进制数字a,该数字至少包含一个大于1的数字。该数字可能以前导零开头。然后,他们应该找到满足以下两个条件的最大正数x:
1. x既不包含数字0也不包含数字1
2. F(x)=F(a)
输入
第一行包含一个整数 n(1≤ n ≤15)
第二行包含一个数字a,其中至少有一个大于1的数字,数字a可能包含前导零。
输出
输出一个整数,此数字不能包含0和1
样例输入
4
1324
样例输出
33222
提示
F(1324)=1!*3!*2!*4!=F(33222)
AC代码
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
string a;
cin>>a;
//可删可不删
// for(int i=0;i<n;i++)
// {
// if(a[i]=='1'||a[i]=='0')
// a.erase(i,1);//从字符串第i个位置中删除1个字符
// }
vector<int> ans;
for(int i=0;i<a.length();i++)
{
if(a[i]=='2') ans.push_back(2);
if(a[i]=='3') ans.push_back(3);
if(a[i]=='4') ans.push_back(2),ans.push_back(2),ans.push_back(3);
if(a[i]=='5') ans.push_back(5);
if(a[i]=='6') ans.push_back(5),ans.push_back(3);
if(a[i]=='7') ans.push_back(7);
if(a[i]=='8') ans.push_back(2),ans.push_back(2),ans.push_back(2),ans.push_back(7);
if(a[i]=='9') ans.push_back(2),ans.push_back(3),ans.push_back(3),ans.push_back(7);
}
sort(ans.begin(),ans.end());
for(int i=ans.back();!ans.empty();i=ans.back())
{
ans.pop_back();
cout<<i;
}
return 0;
}
注意
这题是有规律的。
当某一位是4时,则对应的换成2,2,3就行。因为4! = 2!+ 2!+ 3!。
同理:
是6时,换成3,5;
是8时,换成2,2,2,7;
是9时,换成2,3,3,7;
以上四种替换都是唯一对应的,所以不存在其他替换可能。