题目描述:Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
题解:基于闰年的定义(参考这里添加链接描述)我们认识到这样一个事实,y和y+18不可能同时为闰年(y为出生年份),如果你出生在2月29日(y为闰年),因为18年以后(y+18不为闰年)肯定不会有2月29日,所以你肯定没有18岁的生日,。
然后:我们可以开始计算生日存在的时候(没有出生在2月29日)从出生到18岁生日所经过的总天数,假如我们先把闰年的情况抛开,单独计算18年的天数,结果为18 x 365 天,那么真实的天数 = 18 x 365 + 我们度过29号的天数。
综合以上我们只要考虑3种情况就好了:
- 生日在2月29日之前:那么18岁那年的29号不管存不存在都跟我们没有关系,我们只要计算从y到y+17所经过的年份中闰年的个数就好了。
- 生日刚好在2月29日:
不存在18岁的生日。 - 生日在2月29日之后:那么出生那年的29号不管存不存在都跟我们没有关系,我们只要计算从y+1到y+18所经过的年份中闰年的个数就好了。
#include <iostream>
using namespace std;
bool isR(int n){
return (n%400==0||((n%100!=0)&&(n%4==0)))?true:false;
}
int main()
{
int T;
cin>>T;
while(T--){
int y,m,d;
scanf("%d-%d-%d",&y,&m,&d);
if(m==2&&d==29){//definitely no 18 birthday
cout<<-1<<endl;
continue;
}
int cnt=0,start=y,end = y+17;//before 2 29
if(m>=3){//after 2 29
start = y+1;
end = y+18;
}
for(int i=start;i<=end;i++){
if(isR(i)) cnt++;
}
cout<<18*365+cnt<<endl;
}
return 0;
}
Hint:
- 公元年分除以4不可整除,为平年。
- 公元年分除以4可整除但除以100不可整除,为闰年。
- 公元年分除以100可整除但除以400不可整除,为平年。
- 公元年分除以400可整除但除以3200不可整除[来源请求],为闰年。