某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
注意测试点4:如果最后没有数据是正确的,那么只输出0就可以了
(M[j-1]会越界);
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct people{
char s[10];
int year;
int month;
int day;
};
int cmp(const void *a,const void *b){
struct people *m = (struct people *)a;
struct people *n = (struct people *)b;
if(m->year!=n->year){
return m->year-n->year;
}
else{
if(m->month!=n->month){
return m->month-n->month;
}
else{
return m->day-n->day;
}
}
}
int main(){
int N;
char s1[10],s2[20];
int i,n=0,j=0;
int count[2]={0};
int temp;
char *p;
char *delim="/";
scanf("%d",&N);
struct people M[N];
for(i=0;i<N;i++){
n=0;
scanf("%s %s",s1,s2);
p = strtok(s2,delim);
while(p!=NULL){
sscanf(p,"%d",&count[n++]);
p = strtok(NULL,delim);
}
if(count[0]<2014-200){
}
else if(count[0]==2014-200){
if(count[1]<9){
}
else if(count[1]==9){
if(count[2]<6){
}
else{
strcpy(M[j].s,s1);
M[j].year = count[0];
M[j].month = count[1];
M[j].day = count[2];
j++;
}
}
else{
strcpy(M[j].s,s1);
M[j].year = count[0];
M[j].month = count[1];
M[j].day = count[2];
j++;
}
}
else if(count[0]<2014){
strcpy(M[j].s,s1);
M[j].year = count[0];
M[j].month = count[1];
M[j].day = count[2];
j++;
}
else if(count[0]==2014){
if(count[1]<9){
strcpy(M[j].s,s1);
M[j].year = count[0];
M[j].month = count[1];
M[j].day = count[2];
j++;
}
else if(count[1]==9){
if(count[2]<=6){
strcpy(M[j].s,s1);
M[j].year = count[0];
M[j].month = count[1];
M[j].day = count[2];
j++;
}
else{
}
}
else{
}
}
else{
}
}
qsort(M,j,sizeof(M[0]),cmp);
if(j==0){
printf("%d",j);
}
else{
printf("%d %s %s",j,M[0].s,M[j-1].s);
}
return 0;
}