某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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
解题思路:
首先想到的是把它们都转化成天,然后找到最大值和最小值,但是这样感觉太麻烦了;而且数据范围太大;然后就想到了把这个日期转化成八位数;最大的八位数对应的是出生最晚的的那个,最小的八位数对应的是出生最早的那个(年龄最大);然后找出最大值和最小值;输出相应的信息;
碰到的问题:
输入的问题,一开始是用的gets输入的字符串,但是gets会读取换行符,造成读取的字符串与输入的字符串不一致;所以,最后用了scanf(“%s %d/%d/%d"),来输入,竟然是可以的,神奇的c语言;还有一个就是c语言指定字符串中输入的字符范围;以后有机会找吧;
#include <stdio.h>
#define N 100000
#define M 6
#define begin 18140906
#define end 20140906
typedef struct person{
char name[M];
int year;
int month, day;
int sym;
}person;
int main() {
person Ip[N];
int i, ValidNum = 0, n;
int Ely = 0,min = 0, Late = 0, max = 0;
scanf("%d",&n);//清除缓存区中的enter;防止它填充到数组里;enter以后会发生什么;
//getchar();
for(i = 0; i < n; i++) {//scanf("%d.%[0-9]E%d",num,&N);
scanf("%s %d/%d/%d",Ip[i].name,&Ip[i].year,&Ip[i].month,&Ip[i].day);
Ip[i].sym = Ip[i].year * 10000 + Ip[i].month*100+Ip[i].day;
if(i == 0) {
min = Ip[i].sym;
}
// printf("sym[%d]= %s\n",i,Ip[i].name);
// printf("sym[%d]= %d\n",i,Ip[i].sym);
if(Ip[i].sym >= begin && Ip[i].sym <= end) {
ValidNum++;
if(min > Ip[i].sym) {
min = Ip[i].sym;
Ely = i;
}
if(max < Ip[i].sym) {
max = Ip[i].sym;
Late = i;
}
}
}
// if(Ip[Ely].year > Ip[i].year) {
// Ely = i;
// //continue;
// }
// else if(Ip[Ely].year== Ip[i].year) {
// if(Ip[Ely].month > Ip[i].month) {
// Ely = i;
// //continue;
// }
// else if(Ip[Ely].month == Ip[i].month) {
// if(Ip[Ely].day > Ip[i].day) {
// Ely = i;
// // continue;
// }
// }
// }
// if(Ip[Late].year < Ip[i].year) {
// Late = i;
// }
// else if(Ip[Late].year == Ip[i].year) {
// if(Ip[Late].month < Ip[i].month) {
// Late = i;
// }
// else if(Ip[Late].month == Ip[i].month) {
// if(Ip[Late].day < Ip[i].day) {
// Late = i;
// }
// }
// }
// }
// getchar();//清除缓存区中的enter;防止它填充到数组里;
// // } else {
// // continue;
// // }
// // printf("%s ",Ip[i].name);
// }
if(ValidNum > 0) {
// printf("E = %d L = %d",Ely,Late);
printf("%d %s %s",ValidNum,Ip[Ely].name,Ip[Late].name);
} else{
printf("0");
}
return 0;
}
其它的思路:
用qsort函数将输入的数组升序排序,第一个年龄最大的,最后一个就是年龄最小的;
柳神思路:
https://blog.csdn.net/liuchuo/article/details/51994511