1028 人口普查 (20分)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,10^5];随后 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
C程序代码示例(无论何时都只会蛮力法的菜鸟)
提交结果
不知道哪个地方出错了,先保存一下代码,留给日后解决
代码
#include <stdio.h>
//使用结构体存储输入的数据
struct Person{
char name[6]; //姓名
int birth; //yyyy/MM/dd -> yyyyMMdd
};
int main(){
int N; //输入数据的个数
scanf("%d",&N);
struct Person person[N];
int num1,num2,num3; //分别对应年月日的临时变量
for(int i=0;i<N;i++){
scanf("%s %d/%d/%d",person[i].name,&num1,&num2,&num3);
person[i].birth=num1*10000+num2*100+num3; //实现转换 yyyy/MM/dd -> yyyyMMdd
}
int count=0; //合格年份计数器
struct Person old; //最年长
struct Person young; //最年轻
int flag=1; //是否为第一个合格的年份
for(int i=0;i<N;i++){
if(person[i].birth<=20140906 && person[i].birth>=18140906){ //合格年份区间[18140906,20140906]
count++; //计数器+1
//为old和young赋初值,只执行一次
if(flag==1){
old=person[i];
young=person[i];
flag--;
continue;
}
//是否为最年长
if(old.birth>person[i].birth){
old=person[i];
continue;
}
//是否为最年轻
if(young.birth<person[i].birth){
young=person[i];
continue;
}
}
}
printf("%d %s %s",count,old.name,young.name);
}