算法笔记之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*二者中间的平年数;
浙公网安备 33010602011771号