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 ",Ss[i].s); 52 else printf("%s",Ss[i].s); 53 } 54 } 55 return 0; 56 }