64,691
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<math.h>
#include<string>
#define MAX 2100000000
typedef long long LL;
LL weishu=MAX; //所求最小数的位数
LL m=MAX;//所求最小数
LL isPrime(LL n) //判断n是否为素数
{
LL i;
if(n==1)return 0;
if(n==2)return 1;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)return 0;
}
return 1;
}
void dfs(LL n,LL ans,LL num)
{
if(n>=11&&isPrime(n)){//大于等于11且是质数,则这种方案不成立
return ;
}
if(n<=9){ //如果数字小于9 就可以取了,不用再深度搜索
if((ans+1<weishu)||(ans+1==weishu)&&(num*10+n<m)){ //如果当前位数小于weishu或者,位数相等但是值要比m小,都将替代最优解m,weishu
m=num*10+n;
weishu=ans+1;
}
}else{
LL i;
for(i=2;i<10&&i<=sqrt(n);i++) //遍历,查找n的每一个因子
{
if(n%i==0){ //一旦发现有因子,对n/i进行深度搜索
dfs(n/i,ans+1,num*10+i);
}
}
}
}
int main()
{
LL n;
scanf("%lld",&n);
dfs(n,0,0);
if(m==MAX){
printf("-1\n");
}else{
printf("%I64d\n",m);
}
return 0;
}