题目来源【codeup 1928】
题目描述
有两个日期。求两个日期之间的天数,如果两个日期是连续的,规定它们之间的天数为两天。
输入格式
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD。
输出格式
每组数据输出一行,即日期差值。
样例输入
20130101
20130105
样例输出
5
思路分析
1.直接读入两个数据year1,year2无法表示年月日关系,因此将两个日期使用%和/分割成两组年(y1y2)月(m1m2)日(d1d2)进行处理。
2.核心思路是通过增加天数d1使得两个年月日相同,如果year1>year2需要先交换再分割。
3.存储各月的天数可以使用一维数组,但考虑到平年闰年2月天数不同,不妨定义一个二维数组,前一维1与0代表是否为闰年,后一维把下标为0的位置腾出,从下标1至下标12分别表示各月的天数。
4.d1超出该月max天数的时候重置为1,并且让m1+1,m1超过12的时候重置为1,并且让y1+1
5.使用bool类型自定义函数判断闰年与否,并将返回值赋给二维数组第一维,0表示平年,1表示闰年。
代码实现:
#include <stdio.h>
int month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} }; //定义二维数组存储平年和闰年各月天数
bool is_Leap(int year) //判断是否为闰年
{
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
int main()
{
int year1, year2;
while (scanf("%d%d", &year1, &year2) != EOF)
{
if (year1 > year2)
{
int temp = year1;
year1 = year2;
year2 = temp;
}
int y1, y2, m1, m2, d1, d2;
y1 = year1 / 10000;
y2 = year2 / 10000;
d1 = year1 % 100;
d2 = year2 % 100;
m1 = year1 / 100 % 100;
m2 = year2 / 100 % 100;
int ans = 1; //两个日期为同一天算1天,因此ans从1开始累加
//如果两天不是同一天,进入循环,通过d1++来使得两个日期相同
while ((y1 != y2) || (m1 != m2) || (d1 != d2)) //只有两组ymd完全相同才结束循环
{
d1++;
if (d1 == month[is_Leap(y1)][m1] + 1) //超过对应月份最大天数,月份进1,天数重置
{
d1 = 1;
m1++;
}
if (m1 > 12) //超过一年最大月份数,月份重置
{
y1++;
m1 = 1;
}
ans++;
}
printf("%d\n", ans);
}
return 0;
}
优化方案:
直接通过增加y1向y2逼近,同时天数+365or366,到y1与y2相差1的时候继续采用增加天数逼近year2。(若直接加到y1 == y2,m1与d1可能>m2与d2导致错误)
参考代码
#include <stdio.h>
int month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} };
bool is_Leap(int year)
{
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
int main()
{
int year1, year2;
while (scanf("%d%d", &year1, &year2) != EOF)
{
if (year1 > year2)
{
int temp = year1;
year1 = year2;
year2 = temp;
}
int y1, y2, m1, m2, d1, d2;
y1 = year1 / 10000;
y2 = year2 / 10000;
d1 = year1 % 100;
d2 = year2 % 100;
m1 = year1 / 100 % 100;
m2 = year2 / 100 % 100;
int ans = 1;
while (y1 < y2-1)
{
if (is_Leap(y1) == 1) ans += 366;
else ans += 365;
y1++;
}
while (y1 < y2 ||m1 < m2 || d1 < d2)
{
d1++;
if (d1 == month[is_Leap(y1)][m1] + 1)
{
d1 = 1;
m1++;
}
if (m1 > 12)
{
y1++;
m1 = 1;
}
ans++;
}
printf("%d\n", ans);
}
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~THE END~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~