问题描述:
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
输入:
一个整数T,表示测试数据的组数,接下来有T行日期,每行一个,格式是YYYY-MM-DD。如我的生日是1988-03-07。
输出:
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
输入样例:
1
1988-03-07
输出样例:
6574
解题分析:
此题需要考虑18岁当中闰年的个数。此外,还需要考虑出生当年和18岁那年是否为闰年,出生日期是否在2月28或29日前后。(若出生年为闰年,且生日在三月前,则出生年会多一个2.29;若18岁生日那天为闰年,且生日在3月后,则18岁那年会多一个2.29,然后再判断从y+1到y+17之间的年份有几个闰年即可。)
这里还有个特殊的情况,就是可能不存在18岁生日那天,这个特殊情况很容易被忽略。
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int run(int n){
if(n%4!=0||(n%100==0&&n%400!=0)) return 0;
else return 1;
}
int main()
{
int t,i;
int y,m,d,sum=0;
scanf("%d",&t);
int y18;
for(i=0;i<t;i++){
scanf("%d-%d-%d",&y,&m,&d);
if(m==2&&d==29){
printf("-1\n");
continue;
}
y18=y+18;
if(run(y)&&m<3) sum++;
if(run(y18)&&m>=3) sum++;
sum=18*365;
int j;
for(j=y+1;j<y18;j++){
sum+=run(j);
}
printf("%d\n",sum);
}
return 0;
}