1028. 人口普查
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
1、字符串数组之间的赋值 #include<string.h> 下的 strcpy()
2、日期之间的比较 一个日期可以表示为year*n(n>365)+month*m(m>31)+day ,其中n,m必须要大于一年的天数和一月的天数。
#include<stdio.h>
#include<iostream>
#include<malloc.h>
#include<string.h>
using namespace std;
typedef struct people
{
char name[6];
int year;
int month;
int day;
}People;
int main()
{
int n;
cin>>n;
int leagelP=0;
int year,month,day;
char name[6];
int i;
int youngest=0,oldest=0;
People *habitant=(People *)malloc(n*sizeof(People));
//People habitant[10000];
for(i=0;i<n;i++)
{
scanf("%s",name);
scanf("%d/%d/%d",&year,&month,&day);
if((year-2014)*1000+(month-9)*100+day-6<=0&&(year-1814)*1000+(month-9)*100+day-6>=0)
{
strcpy(habitant[leagelP].name,name);
//printf("%s\n",habitant[leagelP].name);
habitant[leagelP].year=year;
habitant[leagelP].month=month;
habitant[leagelP].day=day;
leagelP++;
}
}
for(i=0;i<leagelP;i++)
{
if((habitant[i].year-habitant[youngest].year)*1000+(habitant[i].month-habitant[youngest].month)*100+habitant[i].day-habitant[youngest].day>0)
{
youngest=i;
}
if((habitant[i].year-habitant[oldest].year)*1000+(habitant[i].month-habitant[oldest].month)*100+habitant[i].day-habitant[oldest].day<0)
{
oldest=i;
}
}
//printf("%d %d ",youngest,oldest);
if(leagelP!=0)
{
printf("%d %s %s",leagelP,habitant[oldest].name,habitant[youngest].name);
}
else
{
printf("0");
}
return 0;
}