题目不难,就是凑最大数,不过qsort得特殊处理一下,两个数字字符串交换位置比较一下,取较大的情况,记得数组开大点,太小了也是WA ~
代码如下:
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<string> using namespace std; int n_cmp(const void *a,const void *b) { char* _a=(char*)a; char* _b=(char*)b; char aa[1000]={0},bb[1000]={0}; sprintf(aa,"%s%s",_a,_b); sprintf(bb,"%s%s",_b,_a); return strcmp(bb,aa); } char a[50+4][1000]; int main() { #ifdef test freopen("sample.txt","r",stdin); #endif int num; while(scanf("%d",&num)!=EOF) { if(!num) break; for(int i=0; i<num; i++) scanf("%s",a[i]); qsort(a,num,sizeof(a[0]),n_cmp); for(int i=0; i<num; i++) printf("%s",a[i]); puts(""); } return 0; }方法二(效率更高一点):
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<string> using namespace std; int n_cmp(const void *a,const void *b) { char* _a=(char*)a; char* _b=(char*)b; int len_a=strlen(_a),len_b=strlen(_b),flag=0,len=len_a+len_b; for(int i=0,j=0,k=0; i<len; i++,j++,k++) { if(_a[k]<_b[j]) { flag=1; break; } else if(_a[k]>_b[j]) { flag=-1; break; } if(k==len_a-1) k=-1; if(j==len_b-1) j=-1; } return flag; } char a[50+2][1000]; int main() { #ifdef test freopen("sample.txt","r",stdin); #endif int num; while(scanf("%d",&num)!=EOF) { memset(a,0,sizeof(a)); if(!num) break; for(int i=0; i<num; i++) scanf("%s",a[i]); qsort(a,num,sizeof(a[0]),n_cmp); for(int i=0; i<num; i++) printf("%s",a[i]); puts(""); } return 0; }