0
点赞
收藏
分享

微信扫一扫

1028 人口普查 (20 分) -PAT 乙级真题

343d85639154 2022-04-13 阅读 65
算法


某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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

举报

相关推荐

0 条评论