hdu1201 18岁生日

来源:互联网 发布:网络借贷超市 编辑:程序博客网 时间:2024/04/30 16:47

问题 D: 18岁生日

时间限制: 1 Sec  内存限制: 32 MB
提交: 24  解决: 10
[提交][状态][讨论版]

题目描述

zzq的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

输入

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

输出

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

样例输入

11988-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岁生日不存在的情况。