现在的位置: 首页 > 综合 > 正文

NYOJ 312 20岁生日

2013年12月05日 ⁄ 综合 ⁄ 共 1108字 ⁄ 字号 评论关闭

20岁生日

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述
路过这的20岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达20岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达20岁生日所经过的总天数,让他好来比较一下。

输入
一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
输出

T行,每行一个数,表示此人从出生到20岁生日所经过的天数。如果这个人没有20岁生日,就输出-1。

样例输入
1
1988-03-07
样例输出

7305

解题思路:先算出从出生到出生这年结束一共经过了多少天,然后加上从出生第2年到出生第19年每年的天数,最后加上20岁生日那年要经过多少天才是他的生日。   注意:(1)、如果出生这年是闰年,而20年后不是闰年,输出-1;(2)、出生这天为出生的第0天

参考代码:

#include<stdio.h>
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int leapyear(int x) //判断闰年
{
	if((x%4==0&&x%100!=0)||x%400==0)
		return 1;
	return 0;
}
int count(int a,int b,int c) //判断一年中的第几天
{
	int s=0,i;
        if(a%4==0&&a%100!=0||a%400==0)
	{
	   for(i=1;i<b;i++)
		 s+=m[i];
	   if(b>2)
               return s+c+1; //注意闰年2月是29天
	   else 
	       return s+c;	  
	}
	else
	{
	     for(i=1;i<b;i++)
		s+=m[i];
	     return s+c;
	}
}
int main()
{
	int j,n,Y,M,D,sum,y,m,d;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d-%d-%d",&Y,&M,&D);
		if(M==2&&D==29&&!leapyear(Y+20))
		{
			printf("-1\n");
			continue;
		}
		sum=0;
		if(leapyear(Y))
			sum+=366-count(Y,M,D);
		else 
			sum+=365-count(Y,M,D);
		j=1;
		Y++;
		while(j<=20)
		{
			if(leapyear(Y)&&j!=20)
				sum+=366;
			else if(!leapyear(Y)&&j!=20)
				sum+=365;
			else if(j==20)
				sum+=count(Y,M,D);
			Y++;
			j++;
		}
		printf("%d\n",sum);     
	}
	return 0;
}

抱歉!评论已关闭.