拼成最小的数
来源:互联网 发布: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 33和312 31 33 55,这里对于数组中的任意两个元素,a和b,若ab表示a和b字符拼接的数,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
- 拼成最小的数
- 拼成最小的数
- 拼成最小的数
- acm 拼成最小的数
- 1097 拼成最小的数
- 51NOD 1097 拼成最小的数
- 51nod 1097 拼成最小的数
- 51nod 1097 拼成最小的数
- 51Nod 1097 拼成最小的数
- 51nod 1097 拼成最小的数
- 51nod 1097 拼成最小的数
- 51nod 1097 拼成最小的数
- 51nod 1097 拼成最小的数 (排序)
- 51Nod-1097-拼成最小的数
- 51 nod 1097 拼成最小的数 思路:字符串排序
- 51nod 1097 拼成最小的数 思维
- 51nod 1097 拼成最小的数 【简单排序】
- 51Nod 1097 拼成最小的数 排序
- 数数
- C Peimer 第10章编程习题
- 三角形面积
- 2 3 5 7的倍数
- 数塔取数问题
- 拼成最小的数
- 位数阶乘
- 整数分解为2的幂
- 最长回文子串(1)
- [汇编] 基础知识
- [顾城的诗] 远和近
- [顾城的诗] 田埂
- HDU 4907Task schedule
- [Uva] Tex Quates (272)