zoukankan      html  css  js  c++  java
  • 位数阶乘

    题目九、位数阶乘

    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;
    }
  • 相关阅读:
    33. 搜索旋转排序数组
    54. 螺旋矩阵
    46. 全排列
    120. 三角形最小路径和
    338. 比特位计数
    746. 使用最小花费爬楼梯
    spring boot的一些常用注解
    SSM整合Dubbo案例
    一些面试题
    Spring Aop和Spring Ioc(二)
  • 原文地址:https://www.cnblogs.com/MATLABlearning001/p/5396991.html
Copyright © 2011-2022 走看看