题目链接:http://codeforces.com/contest/515/problem/C
题意:定义了f(a)是正整数a中每一位数字的阶乘之和,求没有1,0数字且最大的b使得f(b)=f(a)
思路:可以用数组记录f(a)有哪些因数,而且让b最大,所以可以把非素数的因数分成素数因数,然后从高位到低位输出,有些细节还是要注意。
//Accepted 31 ms 4 KB
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int cnt[11]; //记录每个因数有多少个
int date[11]; //取出一个数字的阶乘后,更新cnt
void dateup() //更新cnt
{
date[2]+=date[4]*2;
date[2]+=date[6];
date[3]+=date[6];
date[2]+=date[8]*3;
date[3]+=2*date[9];
cnt[2]-=date[2];
cnt[3]-=date[3];
cnt[7]-=date[7];
cnt[5]-=date[5];
memset(date,0,sizeof(date));
}
int main()
{
ll n,m;
scanf("%I64d",&n);
scanf("%I64d",&m); //其实用字符串即可,反正只有15位用longlong也可
while(m){
int num=m%10;
for(int i=2;i<=num;i++)
cnt[i]++;
m/=10;
}
cnt[2]+=cnt[4]*2;
cnt[2]+=cnt[6];
cnt[3]+=cnt[6];
cnt[2]+=cnt[8]*3;
cnt[3]+=2*cnt[9];
while(cnt[7]--){
printf("7");
for(int i=2;i<7;i++) date[i]++;
}
dateup();
while(cnt[5]--){
printf("5");
for(int i=2;i<5;i++) date[i]++;
}
dateup();
while(cnt[3]--){
printf("3");
for(int i=2;i<3;i++) date[i]++;
}
dateup();
while(cnt[2]--){
printf("2");
}
puts("");
return 0;
}
上面是中规中矩的写法,也可优化一下,不过可读性下降了
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
int n, num[11];
char a[20];
while(scanf("%d %s", &n, a) != EOF) {
memset(num, 0, sizeof(num));
for(int i = 0; i < n; i++) {
if(a[i] != '0' || a[i] != '1') {
if(a[i] == '6') {
num[5]++;
num[3]++;
}
else if(a[i] == '8') {
num[2] += 3;
num[7] ++;
}
else if(a[i] == '4') {
num[2] += 2;
num[3]++;
}
else if(a[i] == '9') {
num[7]++;
num[2]++;
num[3]+=2;
}
else num[a[i] - '0']++;
}
}
for(int i = 9; i >= 2; i--) {
while(num[i]){
printf("%d", i);
num[i]--;
}
}
printf("\n");
}
return 0;
}