文章目录
一【题目难度】
- 乙级
二【题目编号】
- 1028 人口普查 (20 分)
三【题目描述】
- 某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
- 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
四【题目示例】
-
输入格式:
输入在第一行给出正整数 N N N,取值在 ( 0 , 1 0 5 ] (0,10^5 ] (0,105];随后 N N N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 y y y y / m m / d d yyyy/mm/dd yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。 -
输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。 -
输入样例:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20 -
输出样例:
3 Tom John
五【解题思路】
- 这个题大致思路和1004 成绩排名 (20 分)差不多,都是新建一个结构体保存主要信息,然后通过比较得出结果,只是这道题的比较更复杂一些,具体步骤如下:
- ①:新建 P e r s o n Person Person结构体存储人的姓名,以及生日
- ②:新建 l e s s less less函数,这个函数的作用是 a < = b ( 年 、 月 、 日 ) a<=b(年、月、日) a<=b(年、月、日)返回$ t r u e true true,否则返回 f a l s e false false
- ③:新建 m o r e more more函数,这个函数的作用是 > = b ( 年 、 月 、 日 ) >=b(年、月、日) >=b(年、月、日)返回$ t r u e true true,否则返回 f a l s e false false
- ④:新建 i n i t init init函数,这个函数的作用是初始化参数,young为最年轻的人,old为最年长的人,start为最小边界,end为最大边界
- ⑤:新建 m a i n main main主函数,扫描人数为n,初始化num为0,这个参数的作用是保存数据合法人数,之后开始逐行扫描输入,如果输入数据合法,num++,并且若当前数据(temp)比最年轻的还要年轻要更新,若当前数据(temp)比最年轻的还要年轻要更新,注意这里不能使用 i f … e l s e if…else if…else判断,因为最年轻和最年长可能是同一个人,扫描完之后就是输出,这里还有一个点需要注意,若num为0,特判输出为0,否则会因为后面多输出空格而导致格式错误,其余正常输出即可
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<stdbool.h>
struct Person
{
char name[10];
int y,m,d;
}old,young,start,end,temp;
bool less(struct Person a,struct Person b)
{
if(a.y != b.y)
{
return a.y <= b.y;
}
else if(a.m != b.m)
{
return a.m <= b.m;
}
else
{
return a.d <= b.d;
}
}
bool more(struct Person a,struct Person b)
{
if(a.y != b.y)
{
return a.y >= b.y;
}
else if(a.m != b.m)
{
return a.m >= b.m;
}
else
{
return a.d >= b.d;
}
}
void init()
{
young.y = 1814;
young.m = 9;
young.d = 6;
old.y = 2014;
old.m = 9;
old.d = 6;
start.y = 1814;
start.m = 9;
start.d = 6;
end.y = 2014;
end.m = 9;
end.d = 6;
}
int main()
{
init();
int n = 0,num = 0;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
scanf("%s %d/%d/%d",&temp.name,&temp.y,&temp.m,&temp.d);
if(less(start,temp) && more(end,temp))
{
num++;
if(more(old,temp))
{
old = temp;
}
if(less(young,temp))
{
young = temp;
}
}
}
if(num == 0)
{
printf("0\n");
}
else
{
printf("%d %s %s\n",num,old.name,young.name);
}
return 0;
}