18岁生日

mac2022-06-30  24

【题目描述】 小明的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; } }

转载于:https://www.cnblogs.com/JRX2015U43/p/6533474.html

最新回复(0)