pat basic 1100 校庆

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 <stdlib.h>
#include <string.h>
#define MAXN 19

typedef struct Pnode *PtrP;
typedef struct Pnode {
	char id[MAXN];
	int birth;
} People;

int getBirth(char *id) {
	char temp[9] = {0};
	for ( int i=6; i<14; ++i )
		temp[i-6] = id[i];
	return atoi(temp);
}

int compareBirth(const void *a, const void *b) {
	PtrP pa = (PtrP)a, pb = (PtrP)b;
	return pa->birth - pb->birth;
}

int compareId(const void *a, const void *b) {
	PtrP pa = (PtrP)a, pb = (PtrP)b;
	return strcmp(pa->id, pb->id);
}

int main(int argc, const char *argv[]) {
	int N, M, count, i;
	PtrP temp;

	if ( scanf("%d", &N)==EOF ) printf("error\n");
	People schoolmate[N];
	for ( i=0; i<N; ++i ) {
		if ( scanf("%s", schoolmate[i].id)==EOF ) printf("error\n");
		schoolmate[i].birth = getBirth(schoolmate[i].id);
	}
	qsort(schoolmate, N, sizeof(People), compareId);

	if ( scanf("%d", &M)==EOF ) printf("error\n");
	People comers[M], schoolmate_in_comers[M];
	for ( count=0, i=0; i<M; ++i ) {
		if ( scanf("%s", comers[i].id)==EOF ) printf("error\n");
		comers[i].birth = getBirth(comers[i].id);
		temp = bsearch(comers[i].id, schoolmate, N, sizeof(People), compareId);
		if ( temp ) {
			strcpy(schoolmate_in_comers[count].id, temp->id);
			schoolmate_in_comers[count++].birth = temp->birth;
		}
	}

	printf("%d\n", count);
	if ( count ) {
		qsort(schoolmate_in_comers, count, sizeof(People), compareBirth);
		printf("%s\n", schoolmate_in_comers[0].id);
	} else {
		qsort(comers, M, sizeof(People), compareBirth);
		printf("%s\n", comers[0].id);
	}

	return EXIT_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值