题目不难,就是凑最大数,不过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;
}