有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
前言:日期处理的问题有时很让人头疼,因为有细节要处理:1、平年和闰年(平年:28,闰年:29)2、大小月问题(1,3,5,7,8,10,12月31天 剩下的31天;2月要拿出来)
接下来的题目扫清你对这种类型的恐惧!(反正我以前很不喜欢这类题)
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
每组数据输出一行,即日期差值
20130101
20130105
5
翻日历:
如果当加了一天之后天数d等于当前月份所拥有的天数加一,那么令月份m加一\同时置天数d为1号(即把日期变为下一个月的1号);
如果此时月份m变为13,那么就令年份y加一、同时置月份n为1月(即把日期变为下一年的1月)
代码如下:
1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 int month[13][2]={ 6 {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30}, 7 {31,31},{31,31},{30,30},{31,31},{30,30},{31,31} 8 }; 9 10 bool isLeap(int year){ 11 //判断是否是闰年 12 return (year%4==0&&year%100!=0)||year%400==0; 13 } 14 void y_m_d(int time,int &y,int &m,int &d){ 15 y=time/10000; 16 m=time%10000/100; 17 d=time%100; 18 } 19 void solve(int time1,int time2){ 20 //不妨我设time1始终是时间低的,在本函数中 21 //接下来要提取出y,m,d 22 int y1,m1,d1; 23 int y2,m2,d2; 24 25 //提取出来很简单,会水仙花那道题就一下解决 26 y_m_d(time1,y1,m1,d1); 27 y_m_d(time2,y2,m2,d2); 28 29 //接下来开始以翻日历的方式计天数 30 /*如果当加了一天之后天数d等于当前月份所拥有的天数加一,那么令月份m加一\同时置天数d为1号(即把日期 31 变为下一个月的1号);如果此时月份m变为13,那么就令年份y加一、同时置月份n为1月(即把日期变为下一年的1月)*/ 32 33 int ans=1;//这是用来记天数的,由于本题说如果两个日期是连续的,则规定它们之间的天数为两天 34 //这句话告诉我们,第一天要算进去 35 36 while(y1<y2||m1<m2||d1<d2){ 37 d1++;//天数加一 38 if(d1==month[m1][isLeap(y1)]+1){ 39 //满当月天数 40 m1++; 41 d1=1; 42 } 43 44 if(m1==13){ 45 //月份满12月 46 y1++; 47 m1=1; 48 } 49 ans++;//累计 50 } 51 cout<<ans<<endl; 52 } 53 int main(int argc, char** argv) { 54 int time1,y1,m1,d1; 55 int time2,y2,m2,d2; 56 57 while(cin>>time1>>time2){ 58 if(time1>time2) 59 solve(time2,time1); 60 else 61 solve(time1,time2); 62 } 63 return 0; 64 }
原文:https://www.cnblogs.com/industrial-fd-2019/p/10609766.html