首先说一下思路,由于题目保证最年长的人只有一位,我们可以用两个字符串分别记录两组数据中最大年龄的人,统计所到校友的个数,按是否存在所到校友区分应该输出哪一个,查找时使用qsort和bsearch函数。值得一提的是,在有校友到学校时,输出的是所有校友中年龄最大的,并不是到校校友中年龄最大的。
1100 校庆 (25 分)
2019 年浙江大学将要庆祝成立 122 周年。为了准备校庆,校友会收集了所有校友的身份证号。现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。
输入格式:
输入在第一行给出不超过 105 的正整数 N,随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母X组成的字符串)。题目保证身份证号不重复。
随后给出前来参加校庆的所有人士的信息:首先是一个不超过 105 的正整数 M,随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。
输出格式:
首先在第一行输出参加校庆的校友的人数。然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7-14 位给出的是 yyyymmdd
格式的生日。如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。
输入样例:
5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042
输出样例:
3
150702193604190912
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int comp1(const void* a,const void* b){/*比较函数*/
return strcmp( (char*)a , (char*)b );
}
int main(){
int num , num_arrive = 0 , num_schoolmate ; /*num_arrive为到校的校友的人数*/
char ID_schoolmate[19] , ID_arrive[19] ; /*分别记录校友和所有到校的人中最年长人的身份证号*/
char ID[19]; /*临时记录一个身份证*/
char xiaoyou[100000][19]; /*这里是100000个校友*/
//校友数据的输入
scanf("%d" , &num_schoolmate ) ; /*输入校友的个数*/
scanf("%s",xiaoyou[0]) ; //第一个校友的数据录入
strcpy(ID_schoolmate , xiaoyou[0] ) ;
for(int i = 1 ; i < num_schoolmate ; i++){ //录入其他校友
scanf("%s",xiaoyou[i]) ;
if( strcmp(ID_schoolmate + 6 , xiaoyou[i] + 6) > 0 ){/*若最年长的人发生了变化则ID_schoolmate改变,否则不变*/
strcpy(ID_schoolmate , xiaoyou[i] ) ;
}
}
qsort(xiaoyou , num_schoolmate , 19 , comp1); //借助qsort函数进行排序
//到校人员数据的输入
scanf("%d",&num); /*到校人数*/
scanf("%s",ID);
strcpy(ID_arrive , ID) ;
if(bsearch(ID , xiaoyou , num_schoolmate , sizeof(char)*19 , comp1) != 0)
num_arrive++ ;
while(--num)
{
scanf("%s",ID);
if(bsearch(ID , xiaoyou , num_schoolmate , sizeof(char)*19 , comp1) != 0) /*查找*/
num_arrive++ ;
if(num_arrive == 0 && strcmp(ID + 6, ID_arrive + 6) < 0){ //如果num_arrive不为0的话就没有必要向后进行判断了
strcpy(ID_arrive , ID) ;
}
}
//数据输出
printf("%d\n",num_arrive) ;
if( num_arrive ) /*分两种情况输出相应最年长人的身份证号*/
printf("%s",ID_schoolmate);
else
printf("%s",ID_arrive);
return 0;
}