算法笔记之codeup 1928 日期差值
#include<iostream> using namespace std; /* 日期差值 主要考虑①闰年情况②月份天数不同 1 3 5 7 8 10 12月三十一天 闰年366天,平年355天 闰年判定方法:能被400整除。或者能被4整除但不能被100整除。 个人认为书上算法虽代码简洁,但如果日期相差较大会多次重复访问二维数组,效率并不高,感觉不太好。 */ int ryears[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年天数 int pyears[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//平年天数 bool JudgeYear(int years){ //判断是否是闰年 return ((years%4 == 0 && years%100!=0)||years%400 == 0); } int thyear(int month,int day,int type){ //计算本年剩余天数 int elsdays = 0; if(type == 1){ for(int k = month;k<=12;k++){ elsdays = elsdays + ryears[k]; } } else{ for(int k = month;k<=12;k++){ elsdays = elsdays + pyears[k]; } } elsdays = elsdays - day; return elsdays; } int llyear(int month,int day,int type){ //计算本年已过天数 int thrdays = 0,i=1; if(type == 1){ for(i;i<=month-1;i++){ thrdays = thrdays + ryears[i]; } } else{ for(i;i<=month-1;i++){ thrdays = thrdays + pyears[i]; } } thrdays = thrdays + day; return thrdays; } int GetNum(int low,int high){ //如果同年,判断是否闰年计算月日差值。如果不同年计算年差值 int lyear = low/10000; int lmonth = low/100-lyear*100; int lday = low-lyear*10000-lmonth*100; int hyear = high/10000; int hmonth = high/100-hyear*100; int hday = high-hyear*10000-hmonth*100; int jyl,jyh,n1,n2,num=0; jyl = JudgeYear(lyear); jyh = JudgeYear(hyear); if (lyear == hyear){ //同年情况 n1 = thyear(hmonth,hday,jyh); n2 = llyear(lmonth,lday,jyl); num = (jyl == 1)?366-n1-n2:365-n1-n2 ; } else{ //不同年情况 n1 = thyear(lmonth,lday,jyl); n2 = llyear(hmonth,hday,jyh); num = n1 + n2; //若所差年数大于1,则累加一年的天数。 for(int j = lyear+1;j<hyear;j++){ if(JudgeYear(j)==1){ num = num + 366; } else{ num = num + 365; } } } return num; } int main(){ int fyear,syear,value; while(cin>>fyear>>syear){ value = fyear<syear?GetNum(fyear,syear):GetNum(syear,fyear);//判断哪个日期较大 cout<<value+1<<endl; } return 0; }
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
算法思想:
先判断两个日期大小,然后判断是否同年。
①同年情况:
计算较大日期所处年份的剩余日数n1,较小日期所处年份的已过日数n2。
如果同年只需要计算两月之间差值天数。num = 所处年天数(365或366)-n1-n2;
②不同年情况:
计算较小日期所处年份的剩余日数n1,较大日期所处年份的已过日数n2。(注意和上面同年情况n1 n2相反)
如果两个日期不同年,num = n1+n2+366*二者中间的闰年数+365*二者中间的平年数;