1028 人口普查(20 分)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
思路:将年月日转化为数字直接进行比较
注意点:如果输入数据都不合理,则需要输出0,否则测试点会有一个不能通过
#include<cstdio>
int main(){
long long n,count=0; //n取值范围是(0,100000] ,所以用long long型 ;count用来统计符合条件的人数
scanf("%lld",&n);
struct Info{
char name[10]; //姓名
int year,month,day; //日期
}people[n+5]; //定义了一个结构体
long long number[n+5]; //定义了一个数组用来存储由年月日计算得到的数字
for(int i=0;i<n;i++){
scanf("%s %d/%d/%d",people[i].name,&people[i].year,&people[i].month,&people[i].day);
number[i]=people[i].year*10000+people[i].month*100+people[i].day; //将年月日转化为为数字
if(number[i]>=18140906&&number[i]<=20140906)count++; //判断输入的年月日是否符合要求
else number[i]=-1; //将不合理的输入用-1表示,以方便过滤
}
if(count==0)printf("0\n"); //若输入数据都不合理,直接输出0
else{
long long max=-1,min=20140907; //初始化最小值和最大值
long long j,k;
for(int i=0;i<n;i++){
if(number[i]==-1)continue; //不合理输入不参与比较
if(max<number[i]){
max=number[i];
j=i;
}
if(min>number[i]){
min=number[i];
k=i;
}
}
printf("%lld %s %s\n",count,people[k].name,people[j].name);
}
return 0;
}
第一次写博客,还请点赞支持