Description
安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位
Input
第一行一个整数n,表示有n个身份证号码
余下的n行,每行一个身份证号码。
Output
按出生日期从大到小排序后的身份证号,每行一条
Sample Input 1
5 466272307503271156 215856472207097978 234804580401078365 404475727700034980 710351408803093165
Sample Output 1
404475727700034980 234804580401078365 215856472207097978 710351408803093165 466272307503271156
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
思路:
1.定义一个结构体,把身份证号的日期拆分出来保存到另一个字符数组中。
2.注意——希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。
所以使用STL函数排序时先自定义排序规则,日期优先。
代码:
#include <bits/stdc++.h>
using
namespace
std;
typedef
struct
{
char
sid[19];
//存放身份证号
char
bir[9];
//存放日期
}Myid;
bool
cmp(Myid id1,Myid id2)
{
if
(
strcmp
(id1.bir,id2.bir)!=0)
return
(
strcmp
(id1.bir,id2.bir)>0);
return
(
strcmp
(id1.sid,id2.sid)>0);
}
int
main()
{
int
n;
cin>>n;
Myid *p=
new
Myid[n];
for
(
int
i=0;i<n;i++)
{
scanf
(
"%s"
,p[i].sid);
strncpy
(p[i].bir,&p[i].sid[6],8);
//把身份证号sid从第6位(下标)开始,长度为8复制到bir中
p[i].bir[8]=0;
}
sort(p,p+n,cmp);
for
(
int
i=0;i<n;i++)
printf
(
"%s\n"
,p[i].sid);
delete
[]p;
return
0;
}