若要做这个题,只需考虑这样一个问题,
输入36的结果是多少?
怎么求结果呢,
每位数都是2-9内的数字,需要遍历,如果让值最小的呢,
第一 位数最小,第二 位数高的值应该尽量小
我们在这里用了一个逆序求值的方法
即我们为了使得位数最少,则我们应该用尽可能大的数字去运算,
为了使得值最小。我们应该把小数字放到高数位上。
所以我们每次用最大的数去试,最后的结果逆序输出即可。。
代码如下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define M 100000
int ans[20], len;
int prime[M];
void is_prime()
{
for(int i = 2; i < M/2; i++)
for(int j = i+i; j < M; j+=i)
prime[j] = 1;
}
int dfs(unsigned valu, int cur)
{
if(valu<10) {len = cur+1; ans[cur] = valu; return 1;}
if(valu<M&&prime[valu]==0) return 0;
for(int i = 9; i >= 2; i--)
{
if(valu%i==0&&dfs(valu/i, cur+1)) {ans[cur] = i; return 1; }
}
return 0;
}
int main ()
{
unsigned n;
int cas;
scanf("%d",&cas);
memset(prime,0,sizeof(prime));
is_prime();
while(cas--)
{
scanf("%u",&n);
if(n<10) { printf("%u\n",n); continue; }
if(dfs(n, 0)) for(int i = len-1; i >= 0; i--) printf("%d",ans[i]);
else printf("-1");
printf("\n");
}
return 0;
}