51Nod 2142 第m大的身份证号码#
目录#
1. 题目描述#
1.1. Limit#
Time Limit: 1000 ms
Memory Limit: 131072 kB
1.2. Problem Description#
身份证号是我国公民的唯一识别码,它由 位数字或者字母组成(只可能最后一位是字母)。 位身份证号码的含义如下:第 为省、自治区、直辖市代码:第 位为地级市、盟、自治州代码;第 位为县、县级市、区代码。第 位位出生年月日,比如 代表 年 月 日;第 位为顺序号,第 位代表性别,男为单数,女为双数,第 位为校验码, 和 。作为尾号的校验码,是把前十七位数字代入统一的公式计算出来的。解答本题你不用关心是如何计算出来的。现在给你 个身份证号码,请你按照出生年月日的字典序(年龄从大到小)输出第 个人的身份证号。
一些解释:虽然造数据的人非常辛苦的制造各种各样的身份证号(并且让他们生日互不相同),但是你并不需要验证关于身份证号的任何合法性,包括省市区是否合法,出生年月日是否合法,校验值是否合法,你需要做的仅仅是输出年龄从大到小第 个人的身份证号。
1.3. Input#
输入第一行包含两个正整数 和 ,两数之间用一个空格分隔,接下来的 行每行为一个形如上述格式的身份证号码(不需要关心校验码的正确性,不影响本题解答)。
1.4. Output#
输出仅包含一行,为题目要求的一个身份证号码。
1.5. Sample Input#
4 2
110108196004063022
13021119640203652X
420333197902112718
210222200012036512
1.6. Sample Output#
13021119640203652X
1.7. Source#
2. 解读#
使用STL中的 sort
函数,自定义排序规则即可对身份证号码进行排序。
注:使用 atoi
函数可以将字符串转为数字
3. 代码#
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
// 存储身份证号
string idStrList[100];
// 比较函数
bool cmp(const string& str1, const string& str2)
{
// 出生日期转为int
int buffer1 = atoi(str1.substr(6, 8).c_str());
int buffer2 = atoi(str2.substr(6, 8).c_str());
// 返回比较结果,年龄从大到小排序
return buffer1 < buffer2;
}
int main()
{
int n, m;
// 读入n
scanf("%d %d", &n, &m);
// 读入身份证号
for (int i = 0; i < n; i++) {
// 获取内存空间
idStrList[i].resize(18);
// 读入身份证号
cin >> idStrList[i];
}
// 排序
sort(idStrList, idStrList + n, cmp);
// 输出身份证号
printf("%s\n", idStrList[m - 1].c_str());
}
联系邮箱:curren_wong@163.com
Github:https://github.com/CurrenWong
欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。