【PAT (Basic Level) Practice】——【字符串处理】1100 校庆

一【题目难度】

  • 乙级

二【题目编号】

  • 1100 校庆 (25 分)

三【题目描述】

  • 2019 年浙江大学将要庆祝成立 122 周年。为了准备校庆,校友会收集了所有校友的身份证号。现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。

四【题目示例】

  • 输入格式:
    输入在第一行给出不超过 1 0 5 10^5 105 的正整数 N,随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母X组成的字符串)。题目保证身份证号不重复。
    随后给出前来参加校庆的所有人士的信息:首先是一个不超过 1 0 5 10^5 105的正整数 M,随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。

  • 输出格式:
    首先在第一行输出参加校庆的校友的人数。然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7-14 位给出的是 yyyymmdd 格式的生日。如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。

  • 输入样例:
    5
    372928196906118710
    610481197806202213
    440684198612150417
    13072819571002001X
    150702193604190912
    6
    530125197901260019
    150702193604190912
    220221196701020034
    610481197806202213
    440684198612150417
    370205198709275042

  • 输出样例:
    3
    150702193604190912

五【解题思路】

  • 首先我们要理清题意,我们需要一个函数帮助我们从身份证号中提取出生日期,另外既然需要匹配有多少人出席了,所以我们使用二分查找,那么也就需要一个排序函数。然后我们需要处理输入数据,两组数据的处理过程基本相同,我们都需要找出生日最小的(年龄最大)人,然后存储,只是第二个处理过程中我们还要注意记录出席的校友人数。另外还需要注意要使用 g e t c h a r ( ) getchar() getchar()函数吸收多余的换行符,因为我们扫描输入是字符串。最后只需要分两种情况输出:
    ①:如果有校友出席,输出校友中最年长的
    ②:如果没有校友出席,输出出席人中最年长的

六【最终得分】

  • 25分

七【代码实现】

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int getTime(char* a)
{
    int res = 0;
    for(int i = 6;i<=13;i++)
    {
        res = res * 10 + a[i] - '0';
    }
    return res;
}

int cmp_1100_SchoolCelebration(const void *a,const void *b)
{
    char* x = (char *)a;
    char* y = (char *)b;
    return strcmp(x,y);
}

int main()
{
    int n,m,count = 0,minBirth1 = 100000000,minBirth2 = 100000000;
    long long int id1,id2;
    char id[20],SchoolMate[100000][20];
    scanf("%d",&n);
    getchar();
    for(int i = 0;i<n;i++)
    {
        scanf("%s",SchoolMate[i]);
        getchar();
        minBirth1 = (minBirth1 < getTime(SchoolMate[i])) ? minBirth1 : getTime(SchoolMate[i]);
        id1 = (minBirth1 == getTime(SchoolMate[i])) ? atol(SchoolMate[i]) : id1;
    }
    qsort(SchoolMate,n,sizeof(char)*20,cmp_1100_SchoolCelebration);
    scanf("%d",&m);
    getchar();
    while(m--)
    {
        scanf("%s",id);
        getchar();
        if(bsearch(id,SchoolMate,n,sizeof(char)*20,cmp_1100_SchoolCelebration))
        {
            count++;
        }
        minBirth2 = (minBirth2 < getTime(id)) ? minBirth2 : getTime(id);
        id2 = (minBirth2 == getTime(id)) ? atol(id) : id2;
    }
    printf("%d\n",count);
    if(count != 0)
    {
        printf("%lld",id1);
    }
    else
    {
        printf("%lld",id2);
    }
    return 0;
}

八【提交结果】

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值