首先说一下思路,由于题目保证最年长的人只有一位,我们可以用两个字符串分别记录两组数据中最大年龄的人,统计所到校友的个数,按是否存在所到校友区分应该输出哪一个,查找时使用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);elseprintf("%s",ID_arrive);return 0;
}