题目描述:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出:
每组数据输出一行,即日期差值
样例输入:
20110412
20110422
样例输出:
11
代码:
#include<iostream>
#include<cmath>
#include <cstdlib>
using namespace std;
int main()
{
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //月份数组
int s1 = 0,s2 = 0;
while (cin>>s1>>s2)
{
int n = 0; //相隔天数
int a,b,c,d,e,f;
int y = 0; //标记相隔年数
int m = 0; //标记相隔月数
a = s1 / 10000; //第一个年份
b = s2 / 10000; //第二个年份
c = (s1 % 10000) / 100; //第一个月份
d = (s2 % 10000) / 100; //第二个月份
e = (s1 % 10000) % 100; //第一个天数
f = (s2 % 10000) % 100; //第二个天数
y = abs(b - a);
if (y == 0) //两年在同一年
{
m = abs(d - c);
if (m == 0) //两月在同一月
{
n = abs(f - e) + 1;
}
else //两月不在同一月
{
if (b % 4 == 0 && b % 100 != 0 || b % 400 == 0) //当前年是闰年
{
month[1] = 29;
for (int i = c; i < d; i++)
{
n = n + month[i - 1];
}
n = n - e + 1 + f; //计算间隔天数
}
else //当前年不是闰年
{
month[1] = 28;
for (int i = c; i < d; i++)
{
n = n + month[i - 1];
}
n = n - e + 1 + f;
}
}
}
else //两年不在同一年
{
int j = 0; //闰年个数
for(int i = a + 1; i < b; i ++)
{
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) //判断闰年
{
j ++;
}
}
n = abs(b - a - 1) * 365 + j; //相隔年数转化为天数
if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0) //起始年为闰年
{
month[1] = 29;
for(int i = c; i <= 12; i ++)
{
n = n + month[i - 1];
}
n = n - e + 1;
}
else //起始年不是闰年
{
month[1] = 28;
for(int i = c; i <= 12; i ++)
{
n = n + month[i - 1];
}
n = n - e + 1;
}
if (b % 4 == 0 && b % 100 != 0 || b % 400 == 0) //结束年为闰年
{
month[1] = 29;
for(int i = 1; i < d; i ++)
{
n = n + month[i - 1];
}
n = n + f;
}
else //结束年不是闰年
{
month[1] = 28;
for(int i = 1; i < d; i ++)
{
n = n + month[i - 1];
}
n = n + f;
}
}
cout<<n<<endl;
}
return 0;
}
作者提醒:
我设计的程序的思想是,首先判断两年是否在同一年,然后再判断两年是否在同一月,
然后进行日期差值的计算。这里要注意天数的差值的加1问题。
同时还要在每一种情况下考虑闰年二月天数的问题。我使用数组存储每个月的天数,
然后在计算的时候首先判断是否是闰年,再重新赋值给二月的天数。
要注意一些细节的问题,考虑要周到,就可以了。