【题解】sdoj3735函数(2018-08-07集训T1)

题目链接

问题描述

对于一个整数,定义 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/81542818