前言:日期处理的问题有时很让人头疼,因为有细节要处理:1、平年和闰年(平年:28,闰年:29)2、大小月问题(1,3,5,7,8,10,12月31天 剩下的31天;2月要拿出来)
接下来的题目扫清你对这种类型的恐惧!(反正我以前很不喜欢这类题)
1928: 日期差值
时间限制: 1 Sec 内存限制: 32 MB 提交: 5675 解决: 1326 [提交][状态][讨论版][命题人:外部导入]
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为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 }