1028. 人口普查(20)
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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 <stdlib.h> #include <malloc.h> struct person { char name[10]; char data[20]; int yy; int mm; int dd; }; int logical(yy,mm,dd) { //还没有出生 if(yy>2014) return 0; if(yy==2014) { if(mm<9) return 1; if(mm==9) { if(dd<=6) return 1; return 0; } else return 0; } //超过200岁 if(yy<1814)//不能超过两百岁 return 0; if(yy==1814) { if(mm<9) return 0; if(mm==9) { if(dd>=6) return 1; else return 0; } else return 1;//比9月大的,没有200岁 } else return 1; } int main() { int n,i,max,min,max_i,min_i,count=0; max=0; min=100000000; scanf("%d",&n); struct person *a; a=(struct person *)malloc(n*sizeof(struct person)); for(i=0;i<n;i++) { scanf("%s%s",&a[i].name,&a[i].data); } for(i=0;i<n;i++) { a[i].yy=a[i].mm=a[i].dd=0; int j=0; //分解data成为yy,mm,dd for(j=0;j<4;j++) { a[i].yy=a[i].yy*10+(a[i].data[j]-'0'); } for(j=5;j<7;j++) { a[i].mm=a[i].mm*10+(a[i].data[j]-'0'); } for(j=8;j<10;j++) { a[i].dd=a[i].dd*10+(a[i].data[j]-'0'); } //printf("%d %d %d",a[i].yy,a[i].mm,a[i].dd); } for(i=0;i<n;i++) { //判断是否合理 if(logical(a[i].yy,a[i].mm,a[i].dd)==1) { if(a[i].yy*1000+a[i].mm*100+a[i].dd>max) { max=a[i].yy*1000+a[i].mm*100+a[i].dd; max_i=i; } if(a[i].yy*1000+a[i].mm*100+a[i].dd<min) { min=a[i].yy*1000+a[i].mm*100+a[i].dd; min_i=i; } count++; } } if(count==0) { printf("0"); return 0; } printf("%d ",count); printf("%s ",a[min_i].name); printf("%s",a[max_i].name); }
这道题1)第四个测试点,是没有合理的日期输入,所以要考虑为0的情况2)判断日期谁大谁小,不用挨个挨个的判断年份,再判断月份,天数。直接看成一个8位的整数相比较就好了。(p.s.所以说我写的判断是否合理的函数,logical也是可以改进的。只是最开始写的时候,并没有想到该方法。)