题目描述:
对N个长度最长可达到1000的数进行排序。
输入描述:
输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。
输出描述:
可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。
输入:
3
11111111111111111111111111111
2222222222222222222222222222222222
33333333
输出:
33333333
11111111111111111111111111111
2222222222222222222222222222222222
解题思路:
采用string记录大整数。原因:long double等类型记录大的数字时会转为科学记数法的类型,例如:4717071记为4.71707e+06。采用string记录则不会出现这种问题
利用STL中的stable_sort。采用一个数组记住顺序,采用cmp函数根据题目要求的条件来对顺序数组进行排序,按照排序后的顺序数组值输出。也可以直接用vector这样的结构。
排序时先根据数的位数判断大小,长的数更大。当数的位数相等时,再去比较字符串字典序。
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<string>
#include<math.h>
using namespace std;
string name[120];
bool cmp(int i,int j){
if(name[i].length()<name[j].length())
return true;
if(name[i].length()>name[j].length())
return false;
if(name[i].length()==name[j].length())
return name[i]<name[j];
return false;
}
int main(){
int n;
while(cin>>n){
int r[120];
for(int i=0;i<n;i++){
cin>>name[i];
r[i]=i;
}
stable_sort(r,r+n,cmp);
for(int i=0;i<n;i++){
int t=r[i];
cout<<name[t]<<endl;
}
}
return 0;
}