某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
#include<stdio.h>
#include<string.h>
struct INFO{
char name[6];
char bir[11];
}peo[100002];
bool older(char a[],char b[]){
if(strcmp(a,b)<0) return true;//a的出生年月比b早
else return false;
}
bool value(char a[]){
if(strcmp(a,"2014/09/06")>0) return false;//出生在2014/09/06之后
if(strcmp(a,"1814/09/06")<0) return false;//出生在1814/09/06之前
return true;
}
int main(){
int n,i=0,min,max,minn=0,maxx=1,count=0;
scanf("%d",&n);
strcpy(peo[maxx].bir,"2014/09/07");//初始最大的
strcpy(peo[minn].bir,"1814/09/05");//初始最小的
for(i=2;i<=n+1;i++){
scanf("%s %s",peo[i].name,peo[i].bir);
if(value(peo[i].bir)){
count++;
if(older(peo[i].bir,peo[maxx].bir)) maxx=i;
if(!older(peo[i].bir,peo[minn].bir)) minn=i;
}
}
if(count!=0) printf("%d %s %s\n",count,peo[maxx].name,peo[minn].name);
else printf("%d\n",count);
return 0;
}
注:这道题的陷阱在于,不能将用于比较的最值简单的设为第一组输入的值,因为第一组的只有可能是无效的,另外,需要记录有效组数,若无有效组,则只输出数字0,以下使用书上的表达方式(int输入05,实际上读入的就是5):
#include<stdio.h>
#include<string.h>
struct INFO{
char name[6];
int yy,mm,dd;
}peo[100002];
bool older(INFO a,INFO b){
if(a.yy<b.yy) return true;//a的出生年比b早
if(a.yy>b.yy) return false;
if(a.yy==b.yy){
if(a.mm<b.mm) return true;
if(a.mm>b.mm) return false;
if(a.mm==b.mm){
if(a.dd<b.dd) return true;
if(a.dd>b.dd) return false;
}
}
}
bool value(INFO a){
if(a.yy>2014||a.yy<1814) return false;//出生在2014年之后或1814年之前
if(a.yy==2014){
if(a.mm>9) return false;
if(a.mm==9){
if(a.dd>6) return false;
}
}
if(a.yy==1814){
if(a.mm<9) return false;
if(a.mm==9){
if(a.dd<6) return false;
}
}
return true;
}
int main(){
int n,i=0,min,max,minn=0,maxx=1,count=0;
scanf("%d",&n);
peo[minn].yy=1814;peo[minn].mm=9;peo[minn].dd=5;//初始最小的
peo[maxx].yy=2014;peo[maxx].mm=9;peo[maxx].dd=7;//初始最大的
for(i=2;i<=n+1;i++){
scanf("%s %d/%d/%d",peo[i].name,&peo[i].yy,&peo[i].mm,&peo[i].dd);
if(value(peo[i])){
count++;
if(older(peo[i],peo[maxx])) maxx=i;
if(!older(peo[i],peo[minn])) minn=i;
}
}
if(count!=0) printf("%d %s %s\n",count,peo[maxx].name,peo[minn].name);
else printf("%d\n",count);
return 0;
}