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