某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
不得不说以前的想法的确把事情想得太复杂了,首先题目要求输入日期合法,所以不需要考虑日期问题,然后其实可以直接比较字符串来判断,C也可以用strcmp();
#include <iostream> #include <string> using namespace std; int main() { int n, counter = 0, flag = 1; const string lastdate = "2014/09/06"; const string firstdate = "1814/09/06"; string name, date; string maxname, maxdate, minname, mindate; cin >> n; maxdate = firstdate; mindate = lastdate; while(n--) { cin >> name >> date; if(date >= firstdate && date <= lastdate) { counter++; if(date < mindate) { mindate = date; minname = name; } if(date > maxdate) { maxdate = date; maxname = name; } } } if(counter) cout << counter << " " << minname << " " << maxname << endl; else cout << counter << endl; return 0; }
#include <stdio.h>
#include <string.h>
#define True 1
#define False 0
typedef struct person{
char name[6];
int year;
int mon;
int day;
}per;
int check(per t);
int compare(per a,per b);
int main()
{
int i,n;
int total = 0,flag = 0;
per max,min,ptest;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%d/%d/%d",ptest.name,&ptest.year,&ptest.mon,&ptest.day);
if(check(ptest)==True)
{
if(flag==0)
{
max = ptest;
min = ptest;
flag = 1;
}
total++;
if(compare(max,ptest)==1)
{
max = ptest;
}
if(compare(min,ptest)==-1)
{
min = ptest;
}
}
}
if(total==0)
printf("0");
else
printf("%d %s %s",total,max.name,min.name);
return 0;
}
/**********************/
int check(per t)
{
if(t.year>2014)
return False;
else if(t.year==2014&&t.mon>9)
return False;
else if(t.year==2014&&t.mon==9&&t.day>6)
return False;
if(t.year<1814)
return False;
else if(t.year==1814&&t.mon<9)
return False;
else if(t.year==1814&&t.mon==9&&t.day<6)
return False;
switch(t.mon){
case 1 : if(t.day<=0||t.day>=32) return False; break;
case 2 : if((t.year%4==0&&t.year%400!=0)&&(t.day<=0||t.day>=30))
return False;
else if((t.year%4!=0||t.year%400==0)&&(t.day<=0||t.day>=29))
return False; break;
case 3 : if(t.day<=0||t.day>=32) return False; break;
case 4 : if(t.day<=0||t.day>=31) return False; break;
case 5 : if(t.day<=0||t.day>=32) return False; break;
case 6 : if(t.day<=0||t.day>=31) return False; break;
case 7 : if(t.day<=0||t.day>=32) return False; break;
case 8 : if(t.day<=0||t.day>=32) return False; break;
case 9 : if(t.day<=0||t.day>=31) return False; break;
case 10 : if(t.day<=0||t.day>=32) return False; break;
case 11 : if(t.day<=0||t.day>=31) return False; break;
case 12 : if(t.day<=0||t.day>=32) return False; break;
default : return False; break;
}
return True;
}
/************/
int compare(per a,per b)
{
if(a.year>b.year)
return 1;
else if(a.year==b.year)
{
if(a.mon>b.mon)
return 1;
else if(a.mon==b.mon)
{
if(a.day>b.day)
return 1;
else if(a.day==b.day)
return 0;
}
}
return -1;
}