1 /*UVA10905 思维
2 题目大意:
3 给定n个正整数,你的任务是把它们练成一个最大的数
4 思考:
5 这道题目应该是在考察归纳的思维吧
6 我一开始的思路是将两个字符串按位比较,当位数有剩余时,再分类讨论大小。
7 但是这样写,细节上很容易出错.
8 但是,如果换一种方法,忽略细节,直接连成s1+s2和s2+s1,这样尾数一定相同,直接按位比较,若s1+s2<s2+s1,
9 说明s1<s2;
10 当然,字符串首尾相连,是非常好写的。
11 */
12 #include <iostream>
13 #include <cmath>
14 #include <algorithm>
15 #include <string.h>
16 #include <stdio.h>
17 #include <set>
18 #include <stack>
19 #include <vector>
20 #define maxn 110
21 using namespace std;
22
23 int dig(char c){
24 return c-'0';
25 }
26 struct S{
27 char s[111];
28 bool operator<(const S & X)const{
29 char s1[210],s2[210];
30 int l1=strlen(s),l2=strlen(X.s);
31 for(int i=0;i<l1;i++) s1[i]=s[i];
32 for(int i=0;i<l2;i++) s1[i+l1]=X.s[i];
33 for(int i=0;i<l2;i++) s2[i]=X.s[i];
34 for(int i=0;i<l1;i++) s2[i+l2]=s[i];
35 for(int i=0;i<l1+l2;i++){
36 if (s1[i]<s2[i]) return true;
37 if (s1[i]>s2[i]) return false;
38 }
39 return true;
40 }
41 }Ss[maxn];
42 int main(){
43 int n;
44 while(cin>>n){
45 if (n==0) break;
46 for(int i=0 ;i < n;i++){
47 scanf("%s",Ss[i].s);
48 }
49 sort(Ss,Ss+n);
50 for(int i=n-1;i>=0;i--){
51 if (i==0) printf("%s\n",Ss[i].s);
52 else printf("%s",Ss[i].s);
53 }
54 }
55 return 0;
56 }