这题还是比较有意思的,给你一堆数字,你要把这堆数字一个一个的串联起来组成一个大数字,要求这个数字最大。
本来以为只是比较一下字符串。把字典序从大到小接连起来。后来想想不对。两个字符串长短不同的时候会有错误。
比如 90和9 90的字典序要大于9,但是9放在前面比较好。
所以,当短的数字在长的数字里面出现循环的时候非常棘手。
可以递归的把长数字里面的短数字给去掉,然后比较剩下的部分就好了。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<iostream>
using namespace std;
struct P
{
string s;
bool operator < (const P &o)const
{
return cmp(s,o.s);
}
bool cmp(string s1,string s2)const
{
int l1=s1.size();
int l2=s2.size();
string ts1=s1;
string ts2=s2;
if(l1==l2)
return s1<s2;
if(l1>l2)
{
string ts=ts1.substr(0,l2);
if(ts!=s2)
return ts<s2;
string s=ts1.substr(l2,l1-l2);
return cmp(s,s2);
}
else
{
string ts=ts2.substr(0,l1);
if(ts!=s1)
return s1<ts;
string s=ts2.substr(l1,l2-l1);
return cmp(s1,s);
}
}
}num[200];
int main()
{
int n;
freopen("acm.in","r",stdin);
while(cin>>n&&n!=0)
{
for(int i=0;i<n;i++)
cin>>num[i].s;
sort(num,num+n);
string ans="";
for(int i=n-1;i>=0;i--)
{
ans+=num[i].s;
}
cout<<ans<<endl;
}
fclose(stdin);
return 0;
}