-
题目描述:
-
还记得陈博是个数字完美主义者么?^_^....这次,他又闹脾气了!我们知道计算机中常常要使用数组保存一组数字,但是今天他就要求把数组里的所有数字组成一个,并且这个数字是这些数字所能组成的所有数字中最小的一个,否则他会抓狂的!!!例如:数组{3,32,321},可以组成6个数字3|32|321, 3|321|32, 32|3|321, 32|321|3, 321|32|3, 321|3|32, 最小的就是321323 (321|32|3).
-
输入:
-
输入有多组数据,每组数据包括2行。
第一行包括一个整数n(1<=n<=100),表示数组的大小。接下来一行有n个正整数,每个数都满足[ 1, 1000,000,000 ]。
-
输出:
-
对应每组数据,输出这个数组所能组成的最小的那个数。
-
样例输入:
-
3 32 3 321 5 5 4 3 2 1
-
样例输出:
-
321323 12345
本来这个题是拿来热热身的,谁知道做的时候却被它难住了,主要的问题在于不知道怎么去比较两个数字的大小。开始觉的两个数比较大小时,不止局限于两个数本身,和其他数也有关系,后来发现自己
想错了。
两个数比较,把他们前后拼起来相应比较即可。
开始用的冒泡排序1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 6 char num[102][12]; 7 int ci[102]; 8 9 int cmp(int a, int b) { 10 char at[24], bt[24]; 11 int lena = strlen(num[a]); 12 int lenb = strlen(num[b]); 13 int i = 0; 14 for(int j = 0; j < lena; j++) { 15 at[i++] = num[a][j]; 16 } 17 for(int j = 0; j < lenb; j++) { 18 at[i++] = num[b][j]; 19 } 20 at[i] = '\0'; 21 //puts(at); 22 i = 0; 23 for(int j = 0; j < lenb; j++) { 24 bt[i++] = num[b][j]; 25 } 26 for(int j = 0; j < lena; j++) { 27 bt[i++] = num[a][j]; 28 } 29 bt[i] = '\0'; 30 31 //puts(bt); 32 return strcmp(at,bt); 33 } 34 35 void swap(int &a, int &b) { 36 int tmp = a; 37 a = b; 38 b = tmp; 39 } 40 int main(int argc, char const *argv[]) 41 { 42 int n; 43 while(scanf("%d",&n) != EOF) { 44 for(int i = 0; i < n; i++) { 45 scanf("%s",num[i]); 46 ci[i] = i; 47 } 48 for(int i = n-1; i >= 1; i--) { 49 for(int j = 0; j < i; j++) { 50 if(cmp(ci[j],ci[j+1]) > 0) { 51 swap(ci[j], ci[j+1]); 52 } 53 } 54 } 55 for(int i = 0; i < n; i++) { 56 printf("%s",num[ci[i]]); 57 } 58 puts(""); 59 } 60 return 0; 61 }
调用系统的库函数,速度反而变慢了
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 6 char num[102][12]; 7 int ci[102]; 8 9 int cmp(int a, int b) { 10 char at[24], bt[24]; 11 strcpy(at,num[a]); 12 strcat(at,num[b]); 13 14 strcpy(bt,num[b]); 15 strcat(bt,num[a]); 16 17 //puts(bt); 18 return strcmp(at,bt); 19 } 20 21 void swap(int &a, int &b) { 22 int tmp = a; 23 a = b; 24 b = tmp; 25 } 26 int main(int argc, char const *argv[]) 27 { 28 int n; 29 while(scanf("%d",&n) != EOF) { 30 for(int i = 0; i < n; i++) { 31 scanf("%s",num[i]); 32 ci[i] = i; 33 } 34 for(int i = n-1; i >= 1; i--) { 35 for(int j = 0; j < i; j++) { 36 if(cmp(ci[j],ci[j+1]) > 0) { 37 swap(ci[j], ci[j+1]); 38 } 39 } 40 } 41 for(int i = 0; i < n; i++) { 42 printf("%s",num[ci[i]]); 43 } 44 puts(""); 45 } 46 return 0; 47 }
若用快排,速度则有明显提升
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 6 char num[102][12]; 7 int ci[102]; 8 9 int cmp(const void *a0, const void *b0) { 10 int a = *(int*)a0; 11 int b = *(int *)b0; 12 char at[24], bt[24]; 13 int lena = strlen(num[a]); 14 int lenb = strlen(num[b]); 15 int i = 0; 16 for(int j = 0; j < lena; j++) { 17 at[i++] = num[a][j]; 18 } 19 for(int j = 0; j < lenb; j++) { 20 at[i++] = num[b][j]; 21 } 22 at[i] = '\0'; 23 //puts(at); 24 i = 0; 25 for(int j = 0; j < lenb; j++) { 26 bt[i++] = num[b][j]; 27 } 28 for(int j = 0; j < lena; j++) { 29 bt[i++] = num[a][j]; 30 } 31 bt[i] = '\0'; 32 33 //puts(bt); 34 return strcmp(at,bt); 35 } 36 37 void swap(int &a, int &b) { 38 int tmp = a; 39 a = b; 40 b = tmp; 41 } 42 int main(int argc, char const *argv[]) 43 { 44 int n; 45 while(scanf("%d",&n) != EOF) { 46 for(int i = 0; i < n; i++) { 47 scanf("%s",num[i]); 48 ci[i] = i; 49 } 50 qsort(ci, n, sizeof(int), cmp); 51 for(int i = 0; i < n; i++) { 52 printf("%s",num[ci[i]]); 53 } 54 puts(""); 55 } 56 return 0; 57 }
脑子真是被门挤了
--------------------2016-9-19更新
今天看代码有看不懂了,主要在于比较时,比如32和321,拼起来比较为
32321和32132,这样就解决了数位不一致的问题