日期处理_升级版

日期处理_升级版

在日期处理那一篇的时候,也许会闲太慢了!

怎样加快算法速度?

快算法速度:只需要先把第一个日期的年份不断加1,直到与第二个日期的年份相差1为止,期间根据平年或是闰年来累加365天或者366天。之后再进行不断令天数加1操作

注意:不能直接加到等于第二个日期的年份时才停止。

为什么?

比如:

第一个日期2013年1月10日 

第二个日期2015年1月8日

2013->2014->2015

加到第二个日期时变为 2015年1月10日!你还能翻日历吗?翻回去?

那如果第一个日期为2013年1月7日呢?加到第二个日期时变为2015年1月7日,此时就不需要翻回去,继续翻

综上,为了不需要分情况讨论,使得编程麻烦,那么就干脆加到与第二个日期的年份相差1为止(这句话是一个边界条件,在编程的时候一定要注意!不然在翻日历的时候,永远翻不到那一天,为什么?因为你已经走过了那一天,过去的光阴一去不复返!提交会报错为超时)

在代码中,我设的条件是 while(y1<y2-1){相关操作} 不能是y1<y2

为什么?

假如 第一个日期的年份时2013 第二个日期的年份是2015

如果我设成y1<y2

开始 y1=2013 y2=2015

2013<2015满足 y1++   y1=2014 y2=2015

2014<2015满足 y1++  y1=2015 y2=2015

2015==2015    y1=2015 跳出循环

此时 就可能出现第二个日期变成我走过的日子

在翻日历的时候,是死循环,永远找不到那一天!

代码如下:

 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     //加快算法速度:只需要先把第一个日期的年份不断加1,直到与第二个日期的年份相差1为止,期间根据平年或是闰年来累加365天或者366天。之后再进行不断令天数加1操作
30     int ans=1;//用来记天数
31     
32     while(y1<y2-1){
33         if(isLeap(y1+1)){
34             ans+=366;
35         }else{
36             ans+=365;
37         }
38         y1++;
39     }
40     
41     //此时的日期为y1=y2-1 年 m1月 d1天
42     //开始翻日历 
43     while(y1<y2||m1<m2||d1<d2){
44         d1++;//天数加一
45         if(d1==month[m1][isLeap(y1)]+1){
46             //满当月天数
47             m1++;
48             d1=1; 
49         } 
50         
51         if(m1==13){
52             //月份满12月
53             y1++;
54             m1=1; 
55         }
56         ans++;//累计 
57     }    
58 
59     cout<<ans<<endl;
60     
61 }
62 int main(int argc, char** argv) {
63     int time1,y1,m1,d1;
64     int time2,y2,m2,d2;
65     
66     while(cin>>time1>>time2){
67         if(time1>time2)
68             solve(time2,time1);
69         else
70             solve(time1,time2);
71     }
72     return 0;
73 }

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值