原题链接:蓝桥杯算法提高VIP-身份证排序
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 10;
struct Num{ //一个身份证号码包括
char front[6]; //前面部分
char birthday[8]; //生日部分
char after[4]; //后面部分
}n[maxn];
int stingToint(char* s,int len){ //将字符串转为数字以供比较
int x = 0;
for(int i=0;i<len;i++){
x = x*10+(s[i]-'0');
}
return x;
}
bool cmp(Num a,Num b){ //自定义结构体排序函数
int a_birth,b_birth,a_front,b_front,a_after,b_after;
a_birth = b_birth = a_front = b_front = a_after = b_after = 0;
a_birth = stingToint(a.birthday,8);
b_birth = stingToint(b.birthday,8);
if(a_birth == b_birth){ //如果生日一致,根据身份证号码大小排序
a_front = stingToint(a.front,6);
b_front = stingToint(b.front,6);
if(a_front == b_front){ //如果前半部分还一致,需比较一下后面部分
a_after = stingToint(a.after,4);
b_after = stingToint(b.after,4);
return a_after > b_after;
}else{
return a_front > b_front;
}
}else{
return a_birth > b_birth;
}
}
int cnt = 0;
int main(){
int m;
scanf("%d",&m);
string id;
while(m--){
cin>>id; //将输入字符串拆分为3部分
for(int j=0;j<6;j++){
n[cnt].front[j] = id[j];
}
for(int j=6;j<14;j++){
n[cnt].birthday[j-6] = id[j];
}
for(int j=14;j<18;j++){
n[cnt].after[j-14] = id[j];
}
cnt++;
}
sort(n,n+cnt,cmp); //结构体排序
for(int i=0;i<cnt;i++){ // 将三部分输出
for(int j=0;j<6;j++){
printf("%c",n[i].front[j]);
}
for(int j=0;j<8;j++){
printf("%c",n[i].birthday[j]);
}
for(int j=0;j<4;j++){
printf("%c",n[i].after[j]);
}
printf("\n");
}
return 0;
}
7.3 分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复