题目信息:
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
代码示例:
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <cctype> using namespace std; int N; struct people{ char name[5]; int bir_yyyy; int bir_mm; int bir_dd; }; people cm[10000]; int compare(people cm1,people cm2) { if(cm1.bir_yyyy!=cm2.bir_yyyy) return cm1.bir_yyyy-cm2.bir_yyyy; else if(cm1.bir_mm!=cm2.bir_mm) return cm1.bir_mm-cm2.bir_mm; else return cm1.bir_dd-cm2.bir_dd; } void solve() { int count=0; struct people cmax={"xxxx",1814,9,6},cmin={"xxxx",2014,9,6}; people max=cmin,min=cmax; for(int i=0;i<N;i++) { if(compare(cm[i],cmax)>=0 && compare(cm[i],cmin)<=0) { count++; if(compare(cm[i],min)>=0) min=cm[i]; if(compare(cm[i],max)<=0) max=cm[i]; } } if(count) { cout<<count<<" "<<max.name<<" "<<min.name<<endl; } else cout<<"0"<<endl; } int main() { cin>>N; for(int i=0;i<N;i++) { scanf("%s %d/%d/%d",cm[i].name,&cm[i].bir_yyyy,&cm[i].bir_mm,&cm[i].bir_dd); } solve(); system("pause"); return 0; }分析:这道题又是一个统计比较,统计合理的数据个数,输出最大年龄最小年龄。我在这里利用了一个结构体来统一处理。
可是提交结果会出现一个段错误,我还没找出原因,请大家帮我分析一下: