codeup 1928: 日期差值

这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加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的操作。

题目链接: codeup 1928: 日期差值
在这里插入图片描述
为了方便直接取出每个月的天数,不妨给定一个二维数组int month[13][2],用来存放每个月的天数,其中第二维为0时表示平年,为1时表示闰年。

#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

int month[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} };

int leap(int x)
{
	return (x%4==0&&x%100!=0)||(x%400==0);
}

int main()
{
	int date1,date2;
	int y1,m1,d1,y2,m2,d2;
	while(scanf("%d%d",&date1,&date2)!=EOF)
	{
		if(date1>date2)	//若第一个日期晚于第二个日期,则交换 
		{
			int tmp = date1;
			date1 = date2;
			date2 = tmp; 
		}
		
		y1 = date1/10000, m1 = date1%10000/100, d1 = date1%100;
		y2 = date2/10000, m2 = date2%10000/100, d2 = date2%100;
	
		int ans = 1;
		while(y1<y2||m1<m2||d1<d2)
		{
			d1++;
			if(d1 == month[m1][leap(y1)] + 1)	//满当月天数 
			{
				m1++;	//日期变成下个月一号 
				d1 = 1;
			}
			if(m1 == 13)	//月份满12个月 
			{
				y1++; 	//日期变成下一年一月 
				m1 = 1;
			}
			ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/88820410
今日推荐