Problem Description
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
Input
一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
Output
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
Sample Input
1 1988-03-07
Sample Output
6574
分析:
题目本身不难,有一个地方不容易想到,若此人出生时某一年的2月29日,则该年必为闰年,且18年之后不可能为闰年,所以此时没有18岁生日!!!
AC代码如下:
#include "iostream"
#include "stdio.h"
using
namespace
std;
int
main(
int
argc,
char
* argv[])
{
int
y,m,d; //年月日
int
i;
int
n,sum; //sum记录总天数
int
a[15]={0,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年的12个月
int
b[15]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //平年的12个月份
cin>>n;
while
(n--)
{
scanf
(
"%d-%d-%d"
,&y,&m,&d);
if
(m==2&&d==29) //没有18岁生日的条件
{
cout<<-1<<endl;
}
else
{
sum=0;
if
(y%400==0||(y%4==0 && y%100!=0))
{
sum+=(a[m]-d);
for
(i=m+1;i<=12;i++)
{
sum+=a[i];
}
for
(i=y+1;i<y+18;i++)
{
if
(i%400==0||(i%4==0&&i%100!=0))
{
sum+=366;
}
else
{
sum+=365;
}
}
sum+=d;
if
((y+18)%400==0||((y+18)%4==0&&(y+18)%100!=0))
{
for
(i=1;i<m;i++)
{
sum+=a[i];
}
}
else
{
for
(i=1;i<m;i++)
{
sum+=b[i];
}
}
}
else
{
sum+=(b[m]-d);
for
(i=m+1;i<=12;i++)
{
sum+=b[i];
}
for
(i=y+1;i<y+18;i++)
{
if
(i%400==0||(i%4==0&&i%100!=0))
{
sum+=366;
}
else
{
sum+=365;
}
}
sum+=d;
if
((y+18)%400==0||((y+18)%4==0&&(y+18)%100!=0))
{
for
(i=1;i<m;i++)
{
sum+=a[i];
}
}
else
{
for
(i=1;i<m;i++)
{
sum+=b[i];
}
}
}
cout<<sum<<endl;
}
}
return
0;
}