某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
判断日期大小的方法可能做的有点太麻烦了,一开始想的如果看成是个数也许会方便直观一些,现在看来说不定存成字符串就行,然后用strcmp函数判断,说不定更好
我是采用排序完了从两头开始找的方法,如果两个下标不再改变,则跳出循环,输出分别对应两个下标的数据,数据数量就是两个下标的差再加1了
我也不知道是遍历一遍找到最大的和最小的快还是这样快,不过对于我来说这种想法比较难得想到,我就用了这种
#include <stdio.h> #include <stdlib.h> #include <algorithm> #define TOYEAR 2014 #define TOMONTH 9 #define TODAY 6 using namespace std; struct personInfo { char name[6]; int birthyear; int birthmonth; int birthday; }; inline bool compare (personInfo a, personInfo b) { if(a.birthyear != b.birthyear) return (a.birthyear < b.birthyear); else { if(a.birthmonth != b.birthmonth) return (a.birthmonth < b.birthmonth); else return (a.birthday < b.birthday); } } int main() { int n; scanf("%d", &n); personInfo *pList = (personInfo *) malloc (n * sizeof(personInfo)); int i, j; for(i = 0; i < n; i++) scanf("%s %d/%d/%d", pList[i].name, &pList[i].birthyear, &pList[i].birthmonth, &pList[i].birthday); sort(pList, pList+n, compare); i = 0; j = n-1; int lastnum=0; while(lastnum != (j-i+1)) { lastnum = j-i+1; if(pList[i].birthyear < (TOYEAR-200) || pList[i].birthyear == (TOYEAR-200) && (pList[i].birthmonth < TOMONTH || pList[i].birthmonth == TOMONTH && pList[i].birthday < TODAY)) i++; if(pList[j].birthyear > TOYEAR || pList[j].birthyear == TOYEAR && (pList[j].birthmonth > TOMONTH || pList[j].birthmonth == TOMONTH && pList[j].birthday > TODAY)) j--; } if(lastnum > 0) printf("%d %s %s\n", lastnum, pList[i].name, pList[j].name); else printf("0\n"); return 0; }