ACM-简单题之18岁生日——hdu1201

18岁生日
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 6 Accepted Submission(s) : 2

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


很简单的一道题,毋庸赘述,直接上代码了:

#include <iostream>
using namespace std;

struct Date
{
	int year,month,day;
}dt;

// 判断是否闰年
bool isleap(int year)
{
	if((year%4==0 && year%100!=0) || year%400==0)
		return 1;
	return 0;
}

// 求某一天是该年的第几天
int dday(int year,int month,int day)
{
	int i,sum=0;

	for(i=1;i<month;++i)
	{
		switch(i)
		{
		case 1:sum+=31;break;
		case 3:sum+=31;break;
		case 5:sum+=31;break;
		case 7:sum+=31;break;
		case 8:sum+=31;break;
		case 10:sum+=31;break;
		case 12:sum+=31;break;
		case 4:sum+=30;break;
		case 6:sum+=30;break;
		case 9:sum+=30;break;
		case 11:sum+=30;break;
		case 2:
			{
				if(isleap(year))	sum+=29;
				else	sum+=28;
			}break;
		}
	}
	
	return sum+day;
}


int main()
{
	int n,i,days;
	char x;
	cin>>n;
	while(n--)
	{
		cin>>dt.year>>x>>dt.month>>x>>dt.day;
		
		// 如果这个人没有18岁生日
		if(dt.month==2 && dt.day==29 && !isleap(dt.year+18))
		{
			cout<<-1<<endl;
			continue;
		}
		
		// 初始化的天数为 出生那年到年末的天数
		if(isleap(dt.year))	days=366-dday(dt.year,dt.month,dt.day);
		else	days=365-dday(dt.year,dt.month,dt.day);

		// 从出生第二年循环到第17年
		for(i=dt.year+1;i<dt.year+18;++i)
			if(isleap(i))	days+=366;
			else	days+=365;
		// 输出天数
		cout<<days+dday(dt.year+18,dt.month,dt.day)<<endl;
	}
	return 0;
}


你可能感兴趣的:(ACM,简单题,18岁生日,hdu1201)