杭电1201之18岁生日

来源:互联网 发布:清洗数据方法有哪些 编辑:程序博客网 时间:2024/05/16 17:14
Problem Description
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

分析:

题目本身不难,有一个地方不容易想到,若此人出生时某一年的2月29日,则该年必为闰年,且18年之后不可能为闰年,所以此时没有18岁生日!!!

AC代码如下:

#include "iostream"
#include "stdio.h"
using namespace std;
  
int main(int argc, char* argv[])
{
    int y,m,d; //年月日
    int i;
    int n,sum; //sum记录总天数
    int a[15]={0,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年的12个月
    int b[15]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //平年的12个月份
    cin>>n;
    while(n--)
    {
        scanf("%d-%d-%d",&y,&m,&d);
        if(m==2&&d==29) //没有18岁生日的条件
        {
            cout<<-1<<endl;
        }
        else
        {
  
        sum=0;
        if (y%400==0||(y%4==0 && y%100!=0))
        {
            sum+=(a[m]-d);
            for (i=m+1;i<=12;i++)
            {
                sum+=a[i];
            }
          
            for (i=y+1;i<y+18;i++)
            {
                if (i%400==0||(i%4==0&&i%100!=0))
                {
                    sum+=366;
                }
                else
                {
                    sum+=365;
                }
            }
              
            sum+=d;
            if ((y+18)%400==0||((y+18)%4==0&&(y+18)%100!=0))
            {
                for (i=1;i<m;i++)
                {
                    sum+=a[i];
                }
            }
            else
            {
                for (i=1;i<m;i++)
                {
                    sum+=b[i];
                }
            }
              
        }
        else
        {
            sum+=(b[m]-d);
            for (i=m+1;i<=12;i++)
            {
                sum+=b[i];
            }
            for (i=y+1;i<y+18;i++)
            {
                if (i%400==0||(i%4==0&&i%100!=0))
                {
                    sum+=366;
                }
                else
                {
                    sum+=365;
                }
            }
            sum+=d;
            if ((y+18)%400==0||((y+18)%4==0&&(y+18)%100!=0))
            {
                for (i=1;i<m;i++)
                {
                    sum+=a[i];
                }
            }
            else
            {
                for (i=1;i<m;i++)
                {
                    sum+=b[i];
                }
            }
        }
        cout<<sum<<endl;
        }
    }
    return 0;

0 0