拼成最小的数

来源:互联网 发布:360无法修复网络连接 编辑:程序博客网 时间:2024/06/11 20:01
题目八、拼成最小的数

设有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 10010int 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;}

 

0 0