标签:++ 循环 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