这题最有意思的是:如果生日不存在就输出-1。
生日不存在:
1、输入数据的不符合要求。比如时间小于0、月份大于12、天数大于31、月份和该月天数不相称等。
2、出生是的时间是闰年的2/29,可是18年后的那一年不是闰年。
AC代码:
#include<iostream>
using namespace std;
bool judgeLoopYear(int year) //判断是否是闰年
{
if((year%4==0 && year%100!=0) || year%400==0)
return true;
return false;
}
bool judgeMonthDay(int year,int month,int day) //辅助判断输入的数据是否正确
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(day<=31 && day>0) return true;
case 2:
if((judgeLoopYear(year) && day<=29 && day>0) || (!(judgeLoopYear(year) && day<=28 && day>0)))
return true;
case 4:
case 6:
case 9:
case 11:
if(day<=30 && day>0) return true;
}
return false;
}
bool judgeInputCorrect(int year,int month,int day) //判断输入的数据格式是否正确
{
if(year<0 || month>12 || month<=0 || day>31 || day<=0 || !judgeMonthDay(year,month,day))
return false;
return true;
}
int knowDay(int year,int month) //根据某一年得到该年某一月份的天数
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if((judgeLoopYear(year)))
return 29;
else
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
}
}
int count(int year,int month,int day) //计算
{
int i,num=0;
num+=knowDay(year,month)-day;
for(i=month+1;i<=12;i++)
{
num+=knowDay(year,i);
}
for(i=1;i<=17;i++)
{
if(judgeLoopYear(year+i))
num+=366;
else
num+=365;
}
for(i=1;i<month;i++)
{
num+=knowDay(year+18,i);
}
num+=day;
return num;
}
bool no18Birthday(int year,int month,int day) //出生是闰年,18年后不是闰年,无生日
{
if(month==2 && day==29 && judgeLoopYear(year+18)==false)
return false;
return true;
}
int main()
{
int year,month,day,cas;
cin>>cas;
while(cas--)
{
scanf("%d-%d-%d",&year,&month,&day);
if(judgeInputCorrect(year,month,day)==false || no18Birthday(year,month,day)==false)
{
cout<<-1<<endl;
continue;
}
cout<<count(year,month,day)<<endl;
}
return 0;
}