首页 > 技术文章 > 18岁生日

JRX2015U43 2016-12-10 08:07 原文

【题目描述】
小明的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
【输入格式】
输入的第一行是一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。
【输出格式】
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
【样例输入】
1
1988-03-07
【样例输出】
6574
【分析】
在什么情况下没有18岁生日呢?不难想到,生日是2月29日但是18年后是平年的情况下没有18岁生日,因为没有2月29日了。其实只要生日是2月29日,就一定没有18岁生日,因为出生年份一定可以被4整除,而18不是4的倍数,所以18年后一定是平年,也就一定没有2月29日。
对于有18岁生日的情况,设getAdDays(y,m,d)表示从公元0000年1月1日到公元y年m月d日有多少天,则答案为getAdDays(y+18,m,d)-getAdDays(y,m,d)。
至于getAdDays怎么求,可以先求出0000年到y年每一年的天数之和,然后求出1月到m月每月的天数之和,最后求出1日到d日的天数(就是d辣)累加即可。
至于读入,完全不需要繁琐的字符串,读一个整数再读一个字符即可。

#include<iostream>
using namespace std;
int Pinday[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool check_run(int year){
    if (year%400==0 || (year%100!=0 && year%4==0)) return true; else return false;
}
int getAdDays(int year,int month,int day){
    int aYear=0,aMonth=1,aDay=1,days=0,i;
    for (i=0;i<year;i++){days+=365;if (check_run(i)) days+=1;}
    for (i=1;i<month;i++) days+=Pinday[i-1];
    if (check_run(year) && month>2) days+=1;
    return days+day;
}
int main(){
    int t;
    cin>>t;
    while(t--){
      int y,m,d;
      char c;
      cin>>y>>c>>m>>c>>d;
      if (m==2 && d==29) cout<<-1<<endl; else cout<<getAdDays(y+18,m,d)-getAdDays(y,m,d)<<endl;
    }
}

推荐阅读