位数阶乘

题目九、位数阶乘

 

X是一个n位数的正整数 

现在定义 , 比如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

共一行,表示符合上述条件的最大值。

输入示例

2

44

4

1234

5

12345

6

888888

12

001234567890

输出示例

332222

33222

533222

77777722222222222222

77755333332222222

 

解题思路:

这一题乍一看是数论的内容,我去感觉脑子要炸裂了。==

其实这道题也让我想了很久,但是想通之后发现还是一道找规律的问题。我把我思路的结果写出来大概就能理解这题的思路了。

9! = 9*8*7! = 7!*3!*3!*2!

8! = 8*7! = 7!*2!*2!*2!

6! = 6*5!=3!*5!

4!=2!*2!*3!

2,3,5,7不能分解原样输出,最后的结果在排序一次就好。

 

代码:

 

#include <cstdio>
#include <algorithm>
#define MAX 10000
using namespace std;
char ans[MAX] = {'\0'}; // 结果数组 
bool cmp(char a, char b) {
    return a > b;// 自定义排序,按照降序排序 
}
void change(long long a, int n) {
    int count = 0; // 记录ans数组的有效长度 
    for (int i = 0; a != 0; ){
        switch (a % 10) {// 取最后一位 
            case 9: 
                count = count + 4; // 下面i加了四次,有效长度count也加4 
                ans[i++] = (char)('0' + 7);
                ans[i++] = (char)('0' + 3);
                ans[i++] = (char)('0' + 3);
                ans[i++] = (char)('0' + 2);
                
                break;
            case 8:
                ans[i++] = (char)('0' + 7);
                ans[i++] = (char)('0' + 2);
                ans[i++] = (char)('0' + 2);
                ans[i++] = (char)('0' + 2);
                count += 4;
                break;
            case 6:
                ans[i++] = (char)('0' + 3);
                ans[i++] = (char)('0' + 5);
                count += 2;
                break;
            case 4:
                ans[i++] = (char)('0' + 2);
                ans[i++] = (char)('0' + 2);
                ans[i++] = (char)('0' + 3);
                count += 3;
                break;
            case 2:
                ans[i++] = (char)('0' + 2);
                count += 1;
                break;
            case 3:
                ans[i++] = (char)('0' + 3);
                count += 1;
                break;
            case 5:
                ans[i++] = (char)('0' + 5);
                count += 1;
                break;
            case 7:
                ans[i++] = (char)('0' + 7);
                count += 1;
                break;            
        }
        
        a = a / 10;// 更正a的值,重新循环 
    }
    sort(ans, ans + count, cmp); // 排序 
}

int main() {
    int n;
    long long a;
    scanf("%d%lld", &n, &a);
    change(a, n);
    printf("%s\n", ans);
        
    return 0;
}

 

posted on 2016-04-15 21:25  柏林没有墙  阅读(383)  评论(0编辑  收藏  举报

导航