奇妙数字(数论)题解

题目描述

让将F(x)定义为其数字的阶乘积。例如,F(124)=1!*2!*4!=48

首先,选择一个由n位数字组成的十进制数字a,该数字至少包含一个大于1的数字。该数字可能以前导零开头。然后,他们应该找到满足以下两个条件的最大正数x:

1. x既不包含数字0也不包含数字1

2. F(x)=F(a)

输入

第一行包含一个整数 n(1≤ n ≤15)

第二行包含一个数字a,其中至少有一个大于1的数字,数字a可能包含前导零。

输出

输出一个整数,此数字不能包含0和1

样例输入

4
1324

样例输出

33222

提示

F(1324)=1!*3!*2!*4!=F(33222)

AC代码

#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
int main()
{   
    int n;
    cin>>n;
    string a;
    cin>>a;
    //可删可不删
    // for(int i=0;i<n;i++)
    // {
    //     if(a[i]=='1'||a[i]=='0')
    //     a.erase(i,1);//从字符串第i个位置中删除1个字符
    // }
    vector<int> ans;
    for(int i=0;i<a.length();i++)
    {
        if(a[i]=='2') ans.push_back(2);
        if(a[i]=='3') ans.push_back(3);
        if(a[i]=='4') ans.push_back(2),ans.push_back(2),ans.push_back(3);
        if(a[i]=='5') ans.push_back(5);
        if(a[i]=='6') ans.push_back(5),ans.push_back(3);
        if(a[i]=='7') ans.push_back(7);
        if(a[i]=='8') ans.push_back(2),ans.push_back(2),ans.push_back(2),ans.push_back(7);
        if(a[i]=='9') ans.push_back(2),ans.push_back(3),ans.push_back(3),ans.push_back(7);
    }
    sort(ans.begin(),ans.end());
    for(int i=ans.back();!ans.empty();i=ans.back())
    {
        ans.pop_back();
        cout<<i;
    }
    return 0;
}

注意

这题是有规律的。

当某一位是4时,则对应的换成2,2,3就行。因为4! = 2!+ 2!+ 3!。

同理:

是6时,换成3,5;

是8时,换成2,2,2,7;

是9时,换成2,3,3,7;

以上四种替换都是唯一对应的,所以不存在其他替换可能。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值