问题 D: 18岁生日
时间限制: 1 Sec 内存限制: 32 MB提交: 24 解决: 10
[ 提交][ 状态][ 讨论版]
题目描述
zzq的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
输入
输入的第一行是一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
输出
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
样例输入
1
1988-03-07
样例输出
6574
题意概括:
给一个人的出生日期,算出他18岁生日那天是他出生的多少天?
解题思路:
把这18年分成三部分,第一部分是他出生那天距该年过完还有多少天,第二部分是中间十七年总共多少天,第三部分是他18岁生日那天是该年的第几天,把这三部分相加就是18岁生日那天是他出生的多少天。
代码:
#include<stdio.h>
int Isleap(int y);
int Getyearday(int y,int m,int d);
int main()
{
intn,y,m,d,i,j,k,sum,sum1,sum2,c,f;
scanf("%d",&n);
while(n--)
{
scanf("%04d-%02d-%02d",&y,&m,&d);
c=0;
f=0;
if(Isleap(y)==1&&m==2&&d==29)
{
f=1;
}
if(f==1&&Isleap(y+18)==0)
{
printf("-1\n");
continue;
}
sum1=0;
for(i=y+1;i<=y+17;i++)
{
c++;
if(Isleap(i)==1)
{
sum1+=366;
}
if(Isleap(i)==0)
{
sum1+=365;
}
}
//printf("c=%d",c);
//printf("sum1==%d\n",sum1);
sum2=0;
sum2=Getyearday(y+18,m,d);
//printf("%d\n",Isleap(y));
sum=Getyearday(y,m,d);
if(Isleap(y)==1)
{
sum=366-sum;
}
else
{
sum=365-sum;
}
//printf("sum,sum2%d %d\n",sum,sum2);
printf("%d\n",sum+sum1+sum2);
}
return0;
}
int Getyearday(int y,int m,int d)
{
intk,leap,s;
inttab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
leap=Isleap(y);
s=0;
for(k=1;k<m;k++)
{
d=d+tab[leap][k];
}
returnd;
}
int Isleap(int y)
{
if((y%400==0)||(y%4==0&&y%100!=0))
return1;
return0;
}
错误分析:
1.第二部分本来应该是17年,但一开始把他当成16年,因为是18岁生日,开始和最后都是半年左右不是一整年。
2.忘记了18岁生日不存在的情况。