码迷,mamicode.com
首页 > 其他好文 > 详细

日期处理_升级版

时间:2019-03-28 14:06:23      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:++   循环   getc   速度   提交   编程   日期   strong   back   

日期处理_升级版

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

怎样加快算法速度?

快算法速度:只需要先把第一个日期的年份不断加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 }

 

日期处理_升级版

标签:++   循环   getc   速度   提交   编程   日期   strong   back   

原文地址:https://www.cnblogs.com/industrial-fd-2019/p/10614317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!