大意:给你一个数字A,让你求最小的数字使得该数字各个数字的积为A。
思路:觉得是一道数论题,只要让A的因子从小到大产生,DFS可以过,其余的不知道。
1、首位是不能为1的,1x任何数等于任何数,而且又使数字增加了10倍,不是最小的。
2、枚举A因子的总数。
CODE:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 110
int fac[MAXN], num[MAXN];
int n, tot;
int flag;
void init()
{
flag = 0;
memset(fac, 0, sizeof(fac));
}
void dfs(int cur, int sum, int max)
{
if(cur == max)
{
if(sum == n)
{
flag = 1;
return ;
}
}
if(sum > n) return ;
for(int i = 0; i < tot && !flag; i++)
{
num[cur] = fac[i];
dfs(cur+1, fac[i]*sum, max);
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int i, j;
init();
scanf("%d", &n);
if(n < 10)
{
printf("%d\n", n);
continue;
}
for(i = 2; i <= 9; i++) if(n%i == 0)
{
fac[tot++] = i;
}
for(i = 2; i <= 9; i++)
{
dfs(0, 1, i);
if(flag) break;
}
if(flag)
{
for(j = 0; j < i; j++)
{
printf("%d", num[j]);
}
}
else printf("-1");
printf("\n");
}
return 0;
}
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 110
int fac[MAXN], num[MAXN];
int n, tot;
int flag;
void init()
{
flag = 0;
memset(fac, 0, sizeof(fac));
}
void dfs(int cur, int sum, int max)
{
if(cur == max)
{
if(sum == n)
{
flag = 1;
return ;
}
}
if(sum > n) return ;
for(int i = 0; i < tot && !flag; i++)
{
num[cur] = fac[i];
dfs(cur+1, fac[i]*sum, max);
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int i, j;
init();
scanf("%d", &n);
if(n < 10)
{
printf("%d\n", n);
continue;
}
for(i = 2; i <= 9; i++) if(n%i == 0)
{
fac[tot++] = i;
}
for(i = 2; i <= 9; i++)
{
dfs(0, 1, i);
if(flag) break;
}
if(flag)
{
for(j = 0; j < i; j++)
{
printf("%d", num[j]);
}
}
else printf("-1");
printf("\n");
}
return 0;
}