十八岁的生日

来源:互联网 发布:nestopia mac 编辑:程序博客网 时间:2024/04/28 00:55
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

Input

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

Output

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

Sample Input

11988-03-07

Sample Output

6574

算法一:

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
#define LL long long 
using namespace std;
const  int MAXN =1e5;
const  int MAXM= 1e6;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool pan(int i)//bool 布尔型变量,取值只有0或1,即真或假 
{
    return i%4==0&&i%100!=0||i%400==0;
}
int main()
{
    int t;
scanf("%d",&t);
    while(t--)
{
        int y,m,d;
        scanf("%d-%d-%d",&y,&m,&d);
        if(m==2&&d==29)//出生在2月29的人只能18岁的时候还是闰年才可以。
{
if(!pan(y+18))//想想这步应该是没用的,闰年出生18年后肯定不是闰年 
puts("-1");
}
          else{
            int cnt=0;  // 之后分三部分
            if(pan(y)) 
mon[2]=29;
else 
mon[2]=28; //出生当年

            cnt+=mon[m]-d;
            for(int i=m+1;i<13;i++)
            cnt+=mon[i];    
          for(int i=y+1;i<y+18;i++) //出生后一年到17岁那年
            if(pan(i)) 
cnt+=366;else 
cnt+=365;


           if(pan(y+18)) 
  mon[2]=29;else 
  mon[2]=28;// 18岁那年
           for(int i=1;i<m;i++)
           cnt+=mon[i]; 
          printf("%d\n",cnt+d);
        }
    }
    return 0;

算法二:

#include<cstdio> 
bool check(int n)
{
    if(n%4==0&&n%100!=0||n%400==0) return true;
    return false;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--) 
{
        int ans = 0;
        char ss, rr;
        int y, m, d;
        scanf("%d%c%d%c%d",&y,&ss,&m,&rr,&d);
        if(check(y) && m==2 && d==29)
{
            puts("-1"); continue;
        }
        for(int i = 0; i < 18; i++) 
{
            if(check(y+i)) ans += 366;
            else ans += 365;
        }
        if(check(y+18) && m>2) ans++;
        if(check(y) && m>2 ) ans--;
        printf("%d\n",ans);
    }
return 0;
}