zz’s math problem Ⅰ

题目描述

有些人心如花木,皆向阳而生
|《剑来》
zz很喜欢数学,但是他又是一个数学渣,我们称这种生物叫做学渣,
zz又碰到了一个数学小问题,定义一个函数P (x)
例如:P (123) = 1! ∗ 2! ∗ 3! 现在需要找到的就是最大的大于等于x大的数z的函数值和x相等,
即P (z) = P (x) 当然z这个数不能包含1或者0
还请输出最大的符合要求数z(不一定比x大) 

输入

第1行输入T (1 ≤ T ≤ 20)组数据
第2行输入n(1 ≤ n ≤ 100),表示x的数字个数
第3行输入正整数 x

输出

输出最大的z(数据保证x内含大于1的数,所以z必定有解) 

样例输入

2
4
1234
3
555

样例输出

33222
555

提示

第一个样例f(1234) = 1! ∗ 2! ∗ 3! ∗ 4! = 288 = f(33222) 

//1!=1
//2!=1*2=2
//3!=1*2*3=6
//4!=1*2*3*4=1*2*3*2*2=2!*2!*3!
//5!=1*2*3*4*5=5!
//6!=1*2*3*4*5*6=5!*6=5!*3!
//7!=1*2*3*4*5*6*7=7!
//8!=1*2*3*4*5*6*7*8=7!*8=7!*2!*2!*2!
//9!=1*2*3*4*5*6*7*8*9=7!*3!*3!*2!
#include <bits/stdc++.h>
#include <string.h>
#include <stdio.h>
using namespace std;
char c[110];
int a[10];
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		for(int i=0;i<10;i++)
			a[i]=0;
		scanf("%d",&n);
		scanf("%s",c);
		int sum=0;
		for(int i=0;i<n;i++){
			if(c[i]=='1' || c[i]=='0'){
				continue;
			}
			else if(c[i]=='2'){
				a[2]++;
				sum++;
			}
			else if(c[i]=='3'){
				a[3]++;
				sum++;
			}
			else if(c[i]=='4'){
				a[2]+=2;
				a[3]+=1;
				sum+=3;
			}
			else if(c[i]=='5'){
				a[5]++;
				sum++;
			}
			else if(c[i]=='6'){
				a[3]++;
				a[5]++;
				sum+=2;
			}
			else if(c[i]=='7'){
				a[7]++;
				sum++;
			}
			else if(c[i]=='8'){
				a[2]+=3;
				a[7]+=1;
				sum+=4;
			}
			else if(c[i]=='9'){
				a[7]++;
				a[3]+=2;
				a[2]++; 
				sum+=4;
			}
		}
		if(sum<n){
			printf("%s\n",c);
		}
		else{
			for(int i=7;i>=2;i--){
				for(int j=a[i];j>0;j--){
					printf("%d",i);
				}
			}
			printf("\n");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/doublekillyeye/article/details/81279168