Dbass

导航

算法笔记之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*二者中间的平年数; 

posted on 2020-01-09 17:30  Dbass  阅读(272)  评论(0编辑  收藏  举报