变幻数

题目

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值