【codeup 1928】
输入两个日期,求两者相差的天数。(对连续的两天,规定相差2)
样例输入:
20130101
20130105
样例输出:
5
思路:
假设两个日期,第一个比第二个小。让第一个日期不断累加,直到两者相等。
为减少累加次数,先判断年份之差,如果至少相差两年,就让结果先累加365或366(根据平闰年)。
如果年份相差一年以内,再对日期累加,直到两者相等。
用一个二维数组month[13][2]存放每个月的最大天数。第一维表示月份(从1开始),第二维为0表示平年,1表示闰年。
在每次循环中对天数+1。如果天数达到该月的最大天数+1,则将月份+1,天数重置为1。同理,如果月份达到13,则将年份+1,月份重置为1。
代码:
#include <iostream>
using namespace std;
//判断平闰年
int isLeap(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return 1;
else
return 0;
}
int main()
{
int date1, date2; //输入的两个日期
int y1, m1, d1, y2, m2, d2;
int result = 1;
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}
};
cin >> date1 >> date2;
//year1
y1 = date1 / 10000;
m1 = date1 % 10000 / 100;
d1 = date1 % 100;
//year2
y2 = date2 / 10000;
m2 = date2 % 10000 / 100;
d2 = date2 % 100;
if (y1 > y2) //若第一个大则交换
{
int temp = y1;
y1 = y2;
y2 = temp;
}
while ((y2 - y1) > 1) //年份相差大于1则先对结果整年累加
{
if (isLeap(y1) == 0)
result += 365;
else
result += 366;
}
while (y1 < y2 || m1 < m2 || d1 < d2) //累加天数,直到两者相等
{
++d1;
if (d1 == month[m1][isLeap(y1)] +1)
{
++m1;
d1 = 1;
}
if (m1 == 13)
{
++y1;
m1 = 1;
}
++result;
}
cout << "result:" << result;
}