PAT 1028. 人口普查(20)
2018-02-24 15:54
211 查看
题目描述:
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。输入格式:输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。输出格式:在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
本题目的一大难点是判断所输入年龄的有效性以及年龄的比较,大于两百岁的无效,晚于2014/9/6的也是无效。对于有效年龄,笔者认为不妨忽略闰年的差异,将每年的天数设置为365天,每一个月设置为30天。因为同年或者同月的人在比较时都做了相同的处理,而不同年或者不同月的人年龄比较时相差的年数或者月数足足以弥补我们这样处理的差异。根据每人的出生年月日算出当前情况下的已经生活的天数,再进行比较。笔者又设置计算该天数的函数。我在设置参数时,尽量见文知意。请参考一下代码:
#include<stdio.h>
4000
const int maxn=100001;
struct people{ //设置结构体存储每人的姓名,以及到今天生活的天数
char name[5];
int days;
}ple[maxn];
struct datetime{ //这是题目所给的当天日期,直接在结构体中进行初始化。
int year,month,day;
datetime(){
year=2014;month=9;day=6;
}
};
int birth(int year,int month,int day){ //计算生活天数的函数。 最后返回tianshu
int tianshu=0;datetime today;
if(day>today.day ){ //所给的日期大于当天日期时,从月上面借一月,类比减法
today.day +=30;
today.month--;
tianshu+=today.day -day;
}
else{
tianshu+=today.day -day; // 给的日期小于当天日期时,直接相减
}
if(month>today.month ){ //同上
today.month +=12;
today.year --;
tianshu+=30*(today.month -month);
}
else {
tianshu+=30*(today.month -month);
}
tianshu+=365*(today.year -year); //最后处理年份
return tianshu;
}
int main()
{
int n,year,month,day,max=-1,min=100000,count=0; //对应N,目前所输入某人生日的年 月 日,max初始值为-1,不能设为零,有一个测试点陷阱在这
scanf("%d",&n); //max min这样设置初始值是为了,第一个人的信息参与比较时更新max和min
for(int i=0;i<n;i++){
scanf("%s",&ple[i].name); //读入名字
scanf("%d/%d/%d",&year,&month,&day); //读入该人生日的 年 月 日
if(year>2014){ //如果年份晚于2014的 不做处理,无效信息
}
else if(year==2014&&month>9){ //如果是2014年,但是晚于9月份的,无效信息,不做处理
}
else if(year==2014&&month==9&&day>6){ //如果是2014年9月份的,但晚于6日 无效信息,不做处理
}
else { //凡是在2014年9月6日及之前出生的,进行天数计算
if(birth(year,month,day)<=200*365){ //如果天数超过了两百岁,也属无效信息,只对小于两百岁的处理
ple[i].days =birth(year,month,day); //函数调用,计算天数,并写入结构体中
count++;
if(ple[i].days<min){ //如果当前该人更年轻,min更新
min=ple[i].days ;
}
if(ple[i].days>max){ //如果当前该人更年长,max更新
max=ple[i].days ;
}
}
}
}
printf("%d",count); //输出有效信息个数
for(int i=0;i<n;i++){
if(ple[i].days==max){ //输出年长者
printf(" %s",ple[i].name );
}
}
for(int i=0;i<n;i++){ //输出年轻者,不能在一个循环内部同时输出年长者和年轻者,因为可能年轻者的信息在数组的前面,最后顺序可能会错
if(ple[i].days==min){
printf(" %s",ple[i].name );
}
}
}
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。输入格式:输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“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题目分析:
本题目的一大难点是判断所输入年龄的有效性以及年龄的比较,大于两百岁的无效,晚于2014/9/6的也是无效。对于有效年龄,笔者认为不妨忽略闰年的差异,将每年的天数设置为365天,每一个月设置为30天。因为同年或者同月的人在比较时都做了相同的处理,而不同年或者不同月的人年龄比较时相差的年数或者月数足足以弥补我们这样处理的差异。根据每人的出生年月日算出当前情况下的已经生活的天数,再进行比较。笔者又设置计算该天数的函数。我在设置参数时,尽量见文知意。请参考一下代码:
#include<stdio.h>
4000
const int maxn=100001;
struct people{ //设置结构体存储每人的姓名,以及到今天生活的天数
char name[5];
int days;
}ple[maxn];
struct datetime{ //这是题目所给的当天日期,直接在结构体中进行初始化。
int year,month,day;
datetime(){
year=2014;month=9;day=6;
}
};
int birth(int year,int month,int day){ //计算生活天数的函数。 最后返回tianshu
int tianshu=0;datetime today;
if(day>today.day ){ //所给的日期大于当天日期时,从月上面借一月,类比减法
today.day +=30;
today.month--;
tianshu+=today.day -day;
}
else{
tianshu+=today.day -day; // 给的日期小于当天日期时,直接相减
}
if(month>today.month ){ //同上
today.month +=12;
today.year --;
tianshu+=30*(today.month -month);
}
else {
tianshu+=30*(today.month -month);
}
tianshu+=365*(today.year -year); //最后处理年份
return tianshu;
}
int main()
{
int n,year,month,day,max=-1,min=100000,count=0; //对应N,目前所输入某人生日的年 月 日,max初始值为-1,不能设为零,有一个测试点陷阱在这
scanf("%d",&n); //max min这样设置初始值是为了,第一个人的信息参与比较时更新max和min
for(int i=0;i<n;i++){
scanf("%s",&ple[i].name); //读入名字
scanf("%d/%d/%d",&year,&month,&day); //读入该人生日的 年 月 日
if(year>2014){ //如果年份晚于2014的 不做处理,无效信息
}
else if(year==2014&&month>9){ //如果是2014年,但是晚于9月份的,无效信息,不做处理
}
else if(year==2014&&month==9&&day>6){ //如果是2014年9月份的,但晚于6日 无效信息,不做处理
}
else { //凡是在2014年9月6日及之前出生的,进行天数计算
if(birth(year,month,day)<=200*365){ //如果天数超过了两百岁,也属无效信息,只对小于两百岁的处理
ple[i].days =birth(year,month,day); //函数调用,计算天数,并写入结构体中
count++;
if(ple[i].days<min){ //如果当前该人更年轻,min更新
min=ple[i].days ;
}
if(ple[i].days>max){ //如果当前该人更年长,max更新
max=ple[i].days ;
}
}
}
}
printf("%d",count); //输出有效信息个数
for(int i=0;i<n;i++){
if(ple[i].days==max){ //输出年长者
printf(" %s",ple[i].name );
}
}
for(int i=0;i<n;i++){ //输出年轻者,不能在一个循环内部同时输出年长者和年轻者,因为可能年轻者的信息在数组的前面,最后顺序可能会错
if(ple[i].days==min){
printf(" %s",ple[i].name );
}
}
}
相关文章推荐
- PAT-乙级-1028. 人口普查(20)
- PAT (Basic Level) Practise (中文) 1028. 人口普查(20)
- PAT(B).1028. 人口普查(20)
- 1028. 人口普查(20)--PAT乙级
- PAT : 1028. 人口普查(20)
- PAT乙级 1028. 人口普查(20)
- pat乙级1028. 人口普查(20)
- PAT乙级—1028. 人口普查(20)-native
- PAT乙级1028. 人口普查(20)
- PAT (Basic Level) Practise (中文)1028. 人口普查(20)
- PAT 乙级 1028. 人口普查(20)
- PAT Basic 1028. 人口普查(20)(C语言实现)
- PAT---B1028. 人口普查(20)
- C++ PAT - 1028. 人口普查(20)
- 1028. 人口普查(20)-浙大PAT乙级真题java实现
- PAT1028 人口普查(20)
- 1028. 人口普查(20) PAT乙级真题
- [PAT乙级]1028. 人口普查(20)
- PAT乙级1028. 人口普查(20)
- PAT 乙级 1028. 人口普查(20)