【数据结构算法笔记】----日期差值处理(平年闰年处理、大月小月处理、二月的天数)

题目描述: 有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定他们之间的天数为两天。输入格式:YYYYMMDD

具体思路:不妨假设第一个日期早于第二个日期(否则交换即可)。这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1号(即把日期变为下一个月的1号); 如果此时月份m变为了13,那么就令年份y加1、同时置月份m为1月 (即把日期变为下一年的1月)。
      为了方便直接取出每个月的天数,不妨给定一个二维数组int month[13][2],用来存放每个月的天数,其中第二维为0时表示平年,为1时表示闰年。


注意: 如果想要加快速度,只需要先把第一个日期的年份不断加1,直到与第二个日期的年份相差1为止,期间根据平年或是闰年来累加365天或者366天即可。之后再进行不断令天数加1的操作。

​
#include<stdio.h>
int mouth [13][2]={
   
   {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
    {31,31},{31,31},{30,30},{31,31},{30,30},{31,31}}; /*初始值为0,{平年,闰年}的区别*/
bool isrun(int year){
    return (year%4==0&&year%100!=0)||(year%400==0);}/*判断某年是否为闰年,返回bool值*/ 
int main(){
	int y1,m1,d1;
	int y2,m2,d2;
	int time1,time2;
	while(scanf("%d%d",&time1,&time2)!=EOF){/*输入的值正确,才进行以下操作*/
	  
		if(time1>time2){  /*因为计算差值是day+1的方式,则time1必须小于time2*/
	    	int t=time1;
	    	time1=time2;
	    	time2=t;
		} 
	    y1=time1/10000,m1=time1%10000/100,d1=time1%100;/*将年月日分开取出来*/
		y2=time2/10000,m2=time2%10000/100,d2=time2%100;
		int ans=1;                                     /*看题*/
		while(!((y1==y2)&&(m1==m2)&&(d1==d2))){
			d1++;
			if (d1==mouth[m1][isrun(y1)]+1){/*日期满了进一,月份满了进一*/
				m1++;
				d1=1;	}
			if (m1==13){y1++;m1=1;}
			ans++;
		} 
        printf("%d",ans);
    }
	return 0; 	
}

​

猜你喜欢

转载自blog.csdn.net/weixin_51538341/article/details/125369081