• 位数阶乘


    题目九、位数阶乘

    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] = {''}; // 结果数组 
    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
    ", ans);
            
        return 0;
    }
  • 相关阅读:
    在网上如何找靠谱的兼职?
    Amphorae 与 Octavia Worker 的安全通信实现
    idea遇到XXXXXXXX.java文件上出现小叉号
    2019创业做哪方面,有什么好的建议吗?
    投资理财财经 现在每个月可以抽出2000元的闲钱,投资什么项目比较好?
    开水果蔬菜超市利润大吗?
    理财能不能发家致富?
    不想打工了,手里有10万,想回农村老家创业,却不知道做什么,请各位指点迷津,谢谢?
    为什么很多人说现在做什么生意都不好做?
    ylbtech-SubwayNav(地铁线路导航)-数据库设计
  • 原文地址:https://www.cnblogs.com/MATLABlearning001/p/5396991.html
Copyright © 2020-2023  润新知