位数阶乘

X是一个n位数的正整数  (x=a0a1...an1)  

现在定义  F(x)=i=0n1(ai!)   , 比如F(135)=1!*3!*5!=720.

我们给定一个n位数的整数X(至少有一位数大于1,X中可能有前导0),

然后我们去找一个正整数(s)符合以下条件:

1.这个数尽可能大,

2.这个数中不能含有数字0或1。

3.F(s)=F(x)


Input
每个测试数据输入共2行。
第一行给出一个n,表示x为中数字的个数。(1<=n<=15)
第二行给出n位数的正整数X(X中至少有一位数大于1)
Output
共一行,表示符合上述条件的最大值。
Input示例
4
1234
Output示例
33222
思路:
将十进制数字分解:

9 -> 7332

8 -> 7222

7 -> 7

6 -> 53

5 -> 5

4 -> 322

3 -> 3

2 -> 2

#include <iostream>
#include <cstring>
using namespace std;

typedef long long int ll;

int main()
{
	int n;
	ll input;
	int num[10];
	memset(num, 0, sizeof(num));

    cin >> n;
	cin >> input;

	for (int i = 0; i < n; i++)
	{
		int a = input % 10;
		input /= 10;

		if (a == 2 || a == 3 || a == 5 || a == 7)
		{
			num[a]++;
		}
		else if (a == 9)
		{
			num[7]++;
			num[3] += 2;
			num[2]++;
		}
		else if (a == 8)
		{
			num[7]++;
			num[2] += 3;
		}
		else if (a == 6)
		{
			num[5]++;
			num[3]++;
		}
		else if (a == 4)
		{
			num[3]++;
			num[2] += 2;
		}
	}

	for (int i = 9; i > 1; i--)
	{
		while (num[i] > 0)
		{
			cout << i;
			num[i]--;
		}
	}

	cout << endl;


    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值