作者:波纹飞鱼
T1175 计算两个日期之间的天数
典明粥铺开业了,距离本店成为百年老店还有36521天!
总会有几个值得纪念的日子。那么,我们该如何计算两个日期之间的天数呢?
题目
初看题目,不免会让人在心里发出不屑的疑问:“就这?只需要将两个日期相减,再将结果输出。
明明和我们之前做的入门题目差不多,这么简单的题目凭什么能列为普及T2?”
解题
但是当我们仔细思考时,才会发现这道题目的核心中隐藏着许多的“坑”。
本篇博客计算天数的思路为:先分别计算出两个日期距离元年元月元日的天数,再将天数相减,从而得出两个日期之间的天数。
一,流程图
将题目中的核心提取出来,我们可以绘制出一张流程图。
二,提取关键点
大致的流程图绘制完了,但是细节决定成败,我们需要为我们的流程补充一些关键点。
1.判断两个日期间是否包含闰年的二月,若包含则需将天数加1。
2.1月时,月份所代表的天数为0。除1月外,其余月份代表的天数为本月之前月份所代表天数之和。
3.元年元月元日到目标日期的天数
三,解决关键点
1.判断闰年
为了解决这个程序我们需要在主函数前定义一个函数,用来判断一个年份是否为闰年。
int YN(int x)
{
if(x%4!=0){
return 0;
}
else if(x%100==0&&x%400!=0)
return 0;
else if(x%4==0)
return 1;
}
(由于作者学艺不精,此函数较为简陋,工作原理为判断函数YN(x)的值,若等于1则x是闰年,若等于0则x不是闰年。)
2.各月份代表的天数
为表示每个月代表的天数,我们需要定义一个数组。其中包含初始月份值0和每个月的天数,即1个初始月和12个自然月,共计13个月。
int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
3.元年元月元日到目标日期的天数
为计算元年元月元日到日期的天数,我们需要计算三个部分:
1.元年的总天数。
2.元年和目标年之间所有年份的总天数。
3.目标年元月月日到目标日期的总天数。
下面以元年元月元日到第一目标日期为例,元年元月元日到第二目标日期可以此类推。
for(int i1=2;i1<a1;i1++){
tian1=tian1+365;
if(YN(i1)==1) tian1=tian1+1;
}
for(int i1=2;i1<=12;i1++){
tian1=tian1+yue[i1];
}
tian1=tian1+yue[1]-1;
if(YN(1)==1){
if(1<=2){
tian1=tian1+1;
}
}
for(int i1=1;i1<a2;i1++){
tian1=tian1+yue[i1];
}
tian1=tian1+a3;
if(YN(a1)==1){
if(a2>2) tian1=tian1+1;
}
编程
完成了准备工作,我们就可以正式开始编程了。
我们按照流程图编程,同时将个关键点融合,最后再添加一些细节。
那么,本题的程序便可做出:
#include<iostream>
using namespace std;
int YN(int x)
{
if(x%4!=0){
return 0;
}
else if(x%100==0&&x%400!=0)
return 0;
else if(x%4==0)
return 1;
}
int main()
{
int a1,a2,a3,b1,b2,b3;
cin>>a1>>a2>>a3;
cin>>b1>>b2>>b3;
int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int tian=0,tian1=0,tian2=0;
if(a1==b1){
if(a2==b2) tian=b3-a3;
else{
for(int i=a2+1;i<b2;i++){
tian+=yue[i];
}
tian+=yue[a2]-a3+b3;
if(YN(a1)==1){
if(a2<=2&&b2>2) tian+=1;
}
}
}
else{
for(int i1=2;i1<a1;i1++){
tian1=tian1+365;
if(YN(i1)==1) tian1=tian1+1;
}
for(int i1=2;i1<=12;i1++){
tian1=tian1+yue[i1];
}
tian1=tian1+yue[1]-1;
if(YN(1)==1){
if(1<=2){
tian1=tian1+1;
}
}
for(int i1=1;i1<a2;i1++){
tian1=tian1+yue[i1];
}
tian1=tian1+a3;
if(YN(a1)==1){
if(a2>2) tian1=tian1+1;
}
for(int i2=2;i2<b1;i2++){
tian2=tian2+365;
if(YN(i2)==1) tian2=tian2+1;
}
for(int i2=2;i2<=12;i2++){
tian2=tian2+yue[i2];
}
tian2=tian2+yue[1]-1;
if(YN(1)==1){
if(1<=2){
tian2=tian2+1;
}
}
for(int i2=1;i2<b2;i2++){
tian2=tian2+yue[i2];
}
tian2=tian2+b3;
if(YN(b1)==1){
if(b2>2) tian2=tian2+1;
}
tian=tian2-tian1;
}
cout<<tian;
return 0;
}