题目
https://www.luogu.org/problemnew/show/P2821
思路
题目告诉我们,子变幻数就是父变幻数各个位的乘积。也就是说,把子变幻数分解成若干个大于0小于等于10的数,且这些数的乘积等于子变幻数,那么这些数的任意一种排列都是父变幻数。
所以,我们可以暴力高精把子变幻数除2~9。除到最后,如果发现剩下一个位数大于一位的数(也就是存在大于10的质因子),那么就是不存在父变幻数。
因为要输出最小结果,所以我们要尽量使分解出的数少,也就是从9开始除,一直除到2这样就可以保证位数最少,再按照从小往大的顺序排即是答案。
还有两个注意的地方:
输入时的前导0,个人觉得没什么影响,可以无视
位数为1的时候答案就是自身
代码
#include<cstdio>
const int N=1005;
int s[N],len,ans[N],num,a[N];
char ch;
int main(){
int i=9,j;
do{
ch=getchar();
if(ch>='0'&&ch<='9')s[++len]=ch-'0';
}while(ch!='\n');
while(i>=2){
int res=0;
for(j=1;j<=len;j++){
res=res*10+s[j];
a[j]=res/i;res%=i;
}
if(!res){
int now=1;
ans[++num]=i;
while(a[now]==0)now++;
for(j=now;j<=len;j++)
s[j-now+1]=a[j];
len=len-now+1;
}
else i--;
}
if(len>1)
{
printf("There is no such number!\n");
return 0;
}
else for(i=num;i>=1;i--)
printf("%d",ans[i]);
return printf("\n"),0;
}