zoukankan      html  css  js  c++  java
  • 拼成最小的数

    题目八、拼成最小的数

    设有n个正整数,将它们联接成一排,组成一个最小的多位整数。

    例如:n=2时,2个整数32,321连接成的最小整数为:32132,

    n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355

    Input

    第1行:1个数N。(2 <= N <= 10000)

    第2 - N + 1行:每行1个正整数。(1 <= A[i] <= 10^9)

    Output

    输出拼在一起的最小整数。由于数据量太大,请以1000个字符为单位,输出到一行里,最终剩余的不足1000个字符的部分,输出到单独1行。

    输入示例

    4

    55

    31

    312

    33

    5

    1234

    12340

    12341

    123

    12345

    6

    112

    11

    19

    111

    110

    90

    输出示例

    312313355

    1231234012341123412345

    110111111121990

    解题思路:

    这题是一个找规律的问题,大家观察输入和输出数组,55 31 312 33312 31 33 55,这里对于数组中的任意两个元素,ab,若ab表示ab字符拼接的数,ab <ba,a在输出后就排在b之前,这就是自定义sort

    代码:

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #define MAX 10010
    int a[MAX] = {0};
    using namespace std;
    int judge(long long n) { // 判断数字的位数 
        int count = 0;
        while (n) {
            n = n / 10;
            count++;
        }
        return count; 
    }
    bool cmp(long long a, long long b) {// 自定义比较函数 
        int na = judge(a);
        int nb = judge(b);
        long long ab = a * pow(10, nb) + b;
        long long ba = b * pow(10, na) + a;
        return ab < ba;// 这里我也不知道怎么解释了,凑合看吧 
    }
    int main(){
        int num;// 数组有效区的大小 
        scanf("%d", &num);
        for (int i = 0; i < num; i++) {
            scanf("%d", &a[i]);// 循环输入 
        }
        sort(a, a + num, cmp); // 自定义排序 
        for (int i = 0; i < num; i++) {
            printf("%d", a[i]);
        }
        
        return 0;
    }
  • 相关阅读:
    dataframe字段过长被截断
    sublime text 3安装Anaconda插件之后写python出现白框
    在tkinter中使用matplotlib
    RemoteDisconnected: Remote end closed connection without response
    object of type 'Response' has no len()
    matploylib之热力图
    pycharm格式化python代码快捷键Ctrl+Alt+L失效
    Windows下Redis集群配置
    七牛云--对象存储
    Spring发送邮件
  • 原文地址:https://www.cnblogs.com/MATLABlearning001/p/5396986.html
Copyright © 2011-2022 走看看