问题描述
对于一个整数,定义 f(x)为他的每个数位的阶乘的乘积。例如 f(135)=1! * 3! * 5! =
720。给出一个数 a(可以包含前缀零), a 满足他的至少一个数位大于 1。我们要求出最
大 的整数 x,其中 x 不含 0 或 1,并且满足 f(a) = f(x)。
输入
第一行一个整数 n,表示 a 的长度。 接下来一个整数 a。
输出
一行一个整数 x 表示答案。
【输入样例 1】
4
1234
【输出样例 1】
33222
【样例 1 说明】
1! * 2! * 3! * 4! = 3! * 3! * 2! * 2! * 2!
【输入样例 2】
2
03
【输出样例】
3
【样例 2 说明】
0! * 3! = 3!
【数据范围】
对 30%的输入数据 : n≤2
对 100%的输入数据 : n≤15
考场上居然把这题打挂了气死了……教练都说这题随便乱搞都能过的……
可以知道2~9的阶乘可以写成2,3,5,7的阶乘的组合……于是我也来乱搞了
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
char a[20];
int num[20];
int zs[4]={2,3,5,7};
vector<int>vx[10];
priority_queue<int>ans;
void Init()
{
vx[2].push_back(2);
vx[3].push_back(3);
vx[4].push_back(3);vx[4].push_back(2);vx[4].push_back(2);
vx[5].push_back(5);
vx[6].push_back(5);vx[6].push_back(3);
vx[7].push_back(7);
vx[8].push_back(7);vx[8].push_back(2);vx[8].push_back(2);vx[8].push_back(2);
vx[9].push_back(7);vx[9].push_back(3);vx[9].push_back(3);vx[9].push_back(2);
}
int main()
{
int n;
Init();
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
num[i]=a[i]-'0';
if(num[i]==0||num[i]==1)continue;
for(int j=0;j<vx[num[i]].size();j++)ans.push(vx[num[i]][j]);
}
while(!ans.empty())
{
int tmp=ans.top();ans.pop();
cout<<tmp;
}
puts("");
return 0;
}