哇昨天考的试博客还没写完今天就接着考……
心态险些炸掉……
【题目】
题目描述:
对于一个整数,定义 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输出
33222
样例数据 2:
输入
2
03输出
3
备注:
【样例1说明】
1! * 2! * 3! * 4! = 3! * 3! * 2! * 2! * 2!
【样例2说明】
0! * 3! = 3!
【数据范围】
对 30% 的输入数据 :n ≤ 2
对 100% 的输入数据 :n ≤ 15
【分析】
首先我们考虑,因为最后的值要尽可能大,那么数的位数就要尽可能多,我们想办法把一个数的阶乘分解成多个数阶乘的积,就比如说 4!= 3!* 2!* 2!,那么 f(322)= f(4),很明显 322 会比 4 更大,以下是这些数阶乘的分解:
- 4!= 3!* 2!* 2!
- 6!= 5!* 3!
- 8!= 7!* 2!* 2!* 2!
- 9!= 7!* 3!* 3!* 2!
- 其他数的阶乘不能分解成多个数阶乘的积
然后很明显,把大的数字放在前面能使答案更优(例如 322 比 223 更优)
知道了这些,代码就很好写了
【代码】
#include<cstdio>
#include<cstring>
using namespace std;
int sum[10];
char s[20];
int main()
{
// freopen("function.in","r",stdin);
// freopen("function.out","w",stdout);
int n,i,x;
scanf("%d",&n);
scanf("%s",s+1);
for(i=1;i<=n;++i)
{
x=s[i]-'0';
if(x==4) sum[3]++,sum[2]+=2;
if(x==6) sum[5]++,sum[3]++;
if(x==8) sum[7]++,sum[2]+=3;
if(x==9) sum[7]++,sum[3]+=2,sum[2]++;
if(x==2||x==3||x==5||x==7) sum[x]++;
}
for(i=9;i>=2;--i)
{
while(sum[i]>0)
{
printf("%d",i);
sum[i]--;
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}