日期处理

前言:日期处理的问题有时很让人头疼,因为有细节要处理: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 }

 

转载于:https://www.cnblogs.com/industrial-fd-2019/p/10609766.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值