当前位置: 代码迷 >> 综合 >> PAT 1100 校庆 (25 分) c语言
  详细解决方案

PAT 1100 校庆 (25 分) c语言

热度:82   发布时间:2023-12-06 12:43:29.0

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