【HDU1201 18岁生日C++】带有详细的解释

题目描述: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种情况就好了:

  1. 生日在2月29日之前:那么18岁那年的29号不管存不存在都跟我们没有关系,我们只要计算从y到y+17所经过的年份中闰年的个数就好了。
  2. 生日刚好在2月29日:不存在18岁的生日。
  3. 生日在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:

  1. 公元年分除以4不可整除,为平年。
  2. 公元年分除以4可整除但除以100不可整除,为闰年。
  3. 公元年分除以100可整除但除以400不可整除,为平年。
  4. 公元年分除以400可整除但除以3200不可整除[来源请求],为闰年。

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/88391154