NYOJ 312 20岁生日

2014-11-24 02:07:53 · 作者: · 浏览: 1

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天

参考代码:


[cpp]
#include
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 s+=m[i];
if(b>2)
return s+c+1; //注意闰年2月是29天
else
return s+c;
}
else
{
for(i=1;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;
}

#include
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 s+=m[i];
if(b>2)
return s+c+1; //注意闰年2月是29天
else
return s+c;
}
else
{
for(i=1;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;
}