看到个挺有意思的题,虽然使用stl非常简单,但要完全不使用stl的话,还是有点头疼的,关键在于如何在不拼接的情况下,计算出最终要的结果,我是从这个点出发的,因为我认为一旦一个一个去拼接比较,浪费空间、浪费时间,还显得很low。
算法关键点在于A和B比较,A与B长度不一致的情况下,要以长的为基准,短的里面取模。可以这样比较的原因,在于是短的在前,长的在后,而前面通过比较已知A、B的相同部分,这个思想和我以前发的一个算法很相似。。
#include<iostream>
using namespace std;
int main(){
int nn;
cin>>nn;
char** buf=new char*[nn];
int tmp;
for(int i=0;i<nn;++i){
buf[i]=new char[12];
cin>>tmp;
int cc=0;
while(tmp>=10){
buf[i][cc]=tmp%10;
tmp/=10;
++cc;
}
buf[i][cc]=tmp;
buf[i][11]=cc;
}
int* aa=new int[nn];
for(int i=0;i<nn;++i){
aa[i]=i;
}
for(int i=0;i<nn;++i){
for(int j=i+1;j<nn;++j){
int len1=buf[aa[i]][11];
int len2=buf[aa[j]][11];
if(len1<len2){
len1=len2;
}
for(int k=0;k<len1+1;++k){
if( buf[aa[i]][buf[aa[i]][11]- k%(buf[aa[i]][11]+1)]< buf[aa[j]][buf[aa[j]][11]- k%(buf[aa[j]][11]+1)] ){
swap(aa[i],aa[j]);
break;
}
else if( buf[aa[i]][buf[aa[i]][11]- k%(buf[aa[i]][11]+1)] == buf[aa[j]][buf[aa[j]][11]- k%(buf[aa[j]][11]+1)] ){
}
else{
break;
}
}
}
}
for(int i=0;i<nn;++i){
for(int j=buf[aa[i]][11];j>=0;--j){
cout<<(char)(buf[aa[i]][j]+'0');
}
}
cout<<endl;
return 0;
}
就懒得delete了....