PAT乙級 1028 人口普查
阿新 • • 發佈:2018-11-08
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。
這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 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<stdio.h> #include<stdlib.h> #include<string.h> #define INIT_SIZE 100 #define INCREMENT 100 typedef struct{ char name[6],birthday[11]; }resident; typedef struct{ resident *elem; int length,listsize; }residentlist; int main(){ resident *newbase; residentlist L; L.elem=(resident *)malloc(INIT_SIZE*sizeof(resident)); L.listsize=INIT_SIZE; L.length=0; int N; scanf("%d",&N); char temp_name[6],temp_birthday[11],t_year[9]; int thisyear=20140906; int birthday,age; int max=2000000,min=0; int oldest=min,youngest=max; int p_oldest=0,p_youngest=0; for(int i=0;i<N;++i){ if(L.length>=L.listsize){ newbase= (resident *)realloc(L.elem,(L.listsize+INCREMENT)*sizeof(resident)); L.elem=newbase; L.listsize+=INCREMENT; } scanf("%s %s",temp_name,temp_birthday); for(int j=0,k=0;j<strlen(temp_birthday);++j){ if(temp_birthday[j]!='/'){ t_year[k++]=temp_birthday[j]; } } birthday=atoi(t_year); age=thisyear-birthday; if(age<=max&&age>=min){ if(age>oldest){ oldest=age; p_oldest=L.length; } if(age<youngest){ youngest=age; p_youngest=L.length; } strcpy(L.elem[L.length].name,temp_name); strcpy(L.elem[L.length++].birthday,temp_birthday); } } if(L.length>0){ printf("%d %s %s",L.length,L.elem[p_oldest].name,L.elem[p_youngest].name); } else{ printf("0"); } return 0; }